了解Java FixedThreadPool

k88*_*074 17 java multithreading callable executorservice

我试图了解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();
Run Code Online (Sandbox Code Playgroud)

这里TaskCallable它构建一些资源,使用它们,然后返回一些输出.

我的问题:Task完成for循环后有多少内存?换句话说:Task一次只有3 个构建资源,或者所有资源都是预先创建的,这样,在.submit我有200个Task(及其资源)等待执行之后?

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

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

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

我想这意味着,在我的示例中,所有200个任务都在队列中,但其中只有3个随时执行.

任何帮助都非常感谢.

JB *_*zet 10

你的代码相当于

for (int i = 1; i <= 200; i++){
    Task t = new Task();
    FL.add(ES.submit(t));
}
Run Code Online (Sandbox Code Playgroud)

在for循环之后,Task的构造函数因此被调用了200次,因此它包含的代码被执行了200次.是否将任务提交给执行程序是无关紧要的:您在循环中调用构造函数200次,并且构造每个任务之后,将其提交给执行程序.执行程序不是调用任务构造函数的执行程序.


gaR*_*Ros 6

任务将从队列中逐个删除,因此在执行过程中,将删除任务,并且只有它们的结果将存储在那些Future对象中.

所以基本上在内存中:

3个线程
200 - > 0任务
0 - > 200未来
(每个执行的任务)


Zie*_*elu 3

所有200个Task都被创建并消耗资源,并且都在队列中。

当有空闲线程可供执行时,线程池只会一一调用它们的 run()/call() 方法。