什么时候应该在java中使用singleThreadExecutor?另外,什么时候应该使用cachedThreadpool? 在文档和书籍中都指出singleThreadExecutor比fixedThreadPool(1)更受欢迎,因为它不会像后者那样修改线程数,但是建议使用哪种方案或使用singleThreadExecutor
答案 0 :(得分:0)
newSingleThreadExecutor()
很好,当你知道在你的情况下在后台做一个额外的线程就足够了(意味着队列中没有大量的工作等待)。而且您不需要/想要扩展Thread
或实施Runnable
并自己完成所有工作转移的工作。 Tasks are guaranteed to execute sequentially
- 如果您知道并行任务执行可能导致死锁或数据竞争,这也可能有用。
cachedThreadpool()
- 只需查看源代码
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
它按需创建新线程并使其闲置不超过1分钟。正如在文档中所述
..这些池通常会提高程序的性能 执行许多短暂的异步任务。要求执行 如果可用,将重用以前构造的线程。如果没有 线程可用,将创建一个新线程并添加到 池。 ..
但是线程数没有上限,所以我宁愿手工构建池,maximumPoolSize
远小于Integer.MAX_VALUE
,例如128。