我试图了解 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
,它构造一些资源,使用它们,并返回一些输出。
我的问题:完成for
循环后,内存中有多少个Task
?换句话说:一次构建它们的资源时是否只有 3 个 Task
,或者所有这些都是预先创建的,这样,在 .submit
之后我有 200 个 任务
(及其资源)等待执行?
注意:资源构建发生在Task
的构造函数中,而不是在call()
方法中。
在javadoc中(随意跳过以下内容):让我感到困惑的是Java文档中的以下解释
Creates a thread pool that reuses a fixed number of threads operating off a shared unbounded queue. At any point, at most nThreads threads will be active processing tasks.
我想这意味着,在我的例子中,所有 200 个任务都在队列中,但在任何时候只有 3 个任务被执行。
非常感谢任何帮助。
最佳答案
你的代码等同于
for (int i = 1; i <= 200; i++){
Task t = new Task();
FL.add(ES.submit(t));
}
而在for循环之后,Task的构造函数就这样被调用了200次,里面的代码就这样被执行了200次。任务是否提交给执行者是无关紧要的:您在一个循环中调用构造函数 200 次,并且在构建每个任务之后,它被提交给执行者。执行者不是调用任务构造函数的人。
关于java - 了解 Java 固定线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29277783/