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)
这里Task
是Callable
它构建一些资源,使用它们,然后返回一些输出.
我的问题: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次,并且在构造每个任务之后,将其提交给执行程序.执行程序不是调用任务构造函数的执行程序.
任务将从队列中逐个删除,因此在执行过程中,将删除任务,并且只有它们的结果将存储在那些Future对象中.
所以基本上在内存中:
3个线程
200 - > 0任务
0 - > 200未来
(每个执行的任务)
归档时间: |
|
查看次数: |
2994 次 |
最近记录: |