- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
据我所知,执行器完成服务提供来自 future 对象的输出,无论任务在入站队列中请求的顺序如何,即无论哪个任务首先完成,结果都会放入出站队列中。另一方面,FixedThreadPool
也是并行执行任务的,那么两者有什么区别呢? (不确定 FixedThreadPool
是否按照任务送入入站队列的顺序按顺序提供输出)
谢谢。
最佳答案
FixedThreadPool
是Executor
的变体之一。它使用 ThreadPoolExecutor
类,其 corePoolSize
和 maximumPoolSize
的值相同。这意味着,如果您创建具有 10 个线程的 FixedThreadPool
,它将始终保留恰好 10 个线程。如果这些线程中的任何一个因运行任务而终止 - 线程池将创建新线程以保持所需的数量。
CompletionService arranges that submitted tasks are, upon completion, placed on a queue.
这意味着,提交任务的所有结果都将放入队列中,您可以稍后处理它们。当您向 CompletionService 提交任务时,它会创建一个包装器,因此异步任务的结果将保存到队列中。它本身并不创建并行性,而是使用 CompletionService
内部的 Executor
来创建并行线程。例如,您可以在内部传递 FixedThreadPool
。
提交给 FixedThreadPool
和 CompletionService
的所有任务都将并行完成,而不保持顺序。
CompletionService
。示例:
//Task extends Callable<Result>
List<Task> tasks = new ArrayList<Task>();
CompletionService<Result> cs = new ExecutorCompletionService<Result>(Executors.newFixedThreadPool(10));
tasks.forEach(task -> cs.submit(task));
for (int i = 0; i < tasks.size(); i++) { // you should know exact amount of submitted tasks
Result r = cs.take().get();
//process r
}
FixedThreadPool
可以在任何其他情况下使用,即当您想要并行线程而不等待结果时。
另外,请注意 FixedThreadPool
和 CachedThreadPool
之间的区别。当您需要保持线程 Activity 并限制其数量时,通常使用第一个。秒数受系统限制,它将并行处理尽可能多的线程。如果 CachedThreadPool 中的线程处于空闲状态,则超时后(默认为 60 秒),该线程将被自动删除。
关于java - ExecutorCompletionService 和 FixThreadPool 执行器之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57057843/
我正在使用固定线程池作为工作线程。以下是我的创建方法: ThreadPoolExecutor producerThreadPool = (ThreadPoolExecutor) Executors.n
我正在尝试在 Java 8 中使用固定线程池,只要它保持在同一函数内,它就可以完美工作。一旦我尝试将执行器共享为参数,它就永远不会并行运行。 这很好用: ``` public static void
据我所知,执行器完成服务提供来自 future 对象的输出,无论任务在入站队列中请求的顺序如何,即无论哪个任务首先完成,结果都会放入出站队列中。另一方面,FixedThreadPool也是并行执行任务
我是一名优秀的程序员,十分优秀!