【问题标题】:singlethreadexecutor - Multuthreading javasinglethreadexecutor - 多线程 java
【发布时间】:2016-05-13 10:36:50
【问题描述】:
什么时候应该在java中使用singleThreadExecutor?另外,什么时候应该使用cachedThreadpool?
在文档和书籍中都指定 singleThreadExecutor 优于 fixedThreadPool(1),因为它不会像后者那样修改线程数,但在哪些情况下建议或使用 singleThreadExecutor
【问题讨论】:
标签:
java
multithreading
concurrency
operating-system
【解决方案1】:
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.