singlethreadexecutor - 多线程java

时间:2016-02-04 00:35:50

标签: java multithreading concurrency operating-system

什么时候应该在java中使用singleThreadExecutor?另外,什么时候应该使用cachedThreadpool? 在文档和书籍中都指出singleThreadExecutor比fixedThreadPool(1)更受欢迎,因为它不会像后者那样修改线程数,但是建议使用哪种方案或使用singleThreadExecutor

1 个答案:

答案 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。