我试图理解Java FixedThreadPool在实践中是如何工作的,但是文档并没有回答我的问题。
假设一个简单的场景,比如:
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个任务被执行。
任何帮助都是非常感谢的。
发布于 2015-03-26 20:04:04
您的代码等同于
for (int i = 1; i <= 200; i++){
Task t = new Task();
FL.add(ES.submit(t));
}
在for循环之后,Task的构造函数被调用了200次,它包含的代码也被执行了200次。任务是否被提交给executor是无关紧要的:您在一个循环中调用一个构造函数200次,在每个任务构造完成之后,它被提交给executor。executor不是调用任务构造器的那个。
发布于 2015-03-26 20:11:40
任务将从队列中逐个删除,因此随着执行的进行,任务将被删除,并且只有任务的结果将存储在这些Future对象中。
所以基本上在内存中:
3个线程
200 -> 0任务
0 -> 200未来
(对于每个执行的任务)
发布于 2015-03-26 20:15:18
您正在使用new Task()
创建200个对象,并将这些任务提交给executor。执行器保存对此Task
对象的引用。因此,如果在Task
的构造函数中构造并持有资源,那么所有的200个任务都将持有资源。
如果可能,如果您不想让200个实例构造和持有资源,可以在Task
的call方法中构造和使用资源。在这种情况下,一次只有3个Task
将构造和保存资源。
https://stackoverflow.com/questions/29277783
复制相似问题