java - 了解 Java 固定线程池

标签 java multithreading executorservice callable

我试图了解 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/

相关文章:

java - 在异步任务中更新 UI 线程

java - 执行服务重启

java - 'natural ordering' 的含义及其与 compareTo() 方法的关系

java - Batik 事件监听器

java - List.indexOf为什么要使用传入Object的equals方法?

java - 简单的Sql查询到Hibernate查询

multithreading - 有没有办法在 Node.JS 中的工作人员/线程/某些东西之间共享内存?

c++ - 执行速度太快后,工作线程永久休眠

java - 执行线程仍然显示在CPU中

java - ExecutorService 不起作用