首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >理解Java FixedThreadPool

理解Java FixedThreadPool
EN

Stack Overflow用户
提问于 2015-03-26 19:56:29
回答 5查看 3.7K关注 0票数 17

我试图理解Java FixedThreadPool在实践中是如何工作的,但是文档并没有回答我的问题。

假设一个简单的场景,比如:

代码语言:javascript
复制
ExecutorService ES= Executors.newFixedThreadPool(3);
List<Future> FL;
for(int i=1;i<=200;i++){
   FL.add(ES.submit(new Task()));
}
ES.shutdown();

其中Task是一个Callable,它构造一些资源,使用它们,并返回一些输出。

My there :完成for循环后,内存中有多少个Task?换句话说:一次只有3个Task构建他们的资源,还是所有的都是预先创建的,这样,在.submit之后,我有200个Task (和他们的资源)等待执行?

注意::资源构造发生在Task的构造函数中,而不是call()方法中。

javadoc中的(请随意跳过以下内容):让我感到困惑的是Java文档中的以下解释

创建了一个线程池,该线程池重用了固定数量的线程,这些线程在共享的无界队列中运行。在任何时候,至多nThreads线程都将是活动的处理任务。

我想这意味着,在我的例子中,所有的200个任务都在队列中,但在任何时候只有3个任务被执行。

任何帮助都是非常感谢的。

EN

回答 5

Stack Overflow用户

发布于 2015-03-26 20:04:04

您的代码等同于

代码语言:javascript
复制
for (int i = 1; i <= 200; i++){
    Task t = new Task();
    FL.add(ES.submit(t));
}

在for循环之后,Task的构造函数被调用了200次,它包含的代码也被执行了200次。任务是否被提交给executor是无关紧要的:您在一个循环中调用一个构造函数200次,在每个任务构造完成之后,它被提交给executor。executor不是调用任务构造器的那个。

票数 11
EN

Stack Overflow用户

发布于 2015-03-26 20:11:40

任务将从队列中逐个删除,因此随着执行的进行,任务将被删除,并且只有任务的结果将存储在这些Future对象中。

所以基本上在内存中:

3个线程

200 -> 0任务

0 -> 200未来

(对于每个执行的任务)

票数 6
EN

Stack Overflow用户

发布于 2015-03-26 20:15:18

您正在使用new Task()创建200个对象,并将这些任务提交给executor。执行器保存对此Task对象的引用。因此,如果在Task的构造函数中构造并持有资源,那么所有的200个任务都将持有资源。

如果可能,如果您不想让200个实例构造和持有资源,可以在Task的call方法中构造和使用资源。在这种情况下,一次只有3个Task将构造和保存资源。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29277783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档