newCachedThreadPool()与newFixedThreadPool()
我应该在什么时候使用其中一个?哪种策略在资源利用率方面更好?
发布于 2009-06-04 09:25:25
我认为文档很好地解释了这两个函数的区别和用法:
newFixedThreadPool
创建了一个线程池,该线程池重用了固定数量的线程,这些线程在共享的无界队列中运行。在任何时候,至多nThreads线程都将是活动的处理任务。如果在所有线程都处于活动状态时提交其他任务,则它们将在队列中等待,直到有线程可用为止。如果任何线程在关机前的执行过程中由于失败而终止,如果需要执行后续任务,则会有一个新线程取而代之。池中的线程将一直存在,直到它被显式关闭。
newCachedThreadPool
创建了一个线程池,该线程池根据需要创建新的线程,但是当以前构造的线程可用时,它将重用这些线程。这些池通常会提高执行许多短期异步任务的程序的性能。对execute的调用将重用以前构造的线程。如果没有可用的现有线程,则会创建一个新线程并将其添加到池中。60秒内未使用的线程将被终止并从缓存中删除。因此,空闲时间足够长的池不会消耗任何资源。请注意,可以使用ThreadPoolExecutor构造函数创建具有相似属性但具有不同细节(例如,超时参数)的池。
在资源方面,newFixedThreadPool将使所有线程保持运行,直到它们被显式终止。在newCachedThreadPool中,60秒内未使用的线程将被终止并从缓存中删除。
鉴于此,资源消耗将在很大程度上取决于这种情况。例如,如果你有大量长时间运行的任务,我建议使用FixedThreadPool。至于CachedThreadPool,文档说“这些池通常会提高执行许多短期异步任务的程序的性能”。
发布于 2015-12-15 17:21:44
为了完成其他的回答,我想引用Joshua Bloch的Effective Java,第二版,第10章,第68项:
“为特定应用程序选择执行器服务可能很棘手。如果您正在编写小程序或轻载服务器,请使用Executors.new- CachedThreadPool通常是一个很好的选择,因为它不需要配置,而且通常”做正确的事情“。但是缓存的线程池不是<>E111<>E212的好选择!
在缓存线程池中,提交的任务不是排队,而是立即移交给线程执行。如果没有可用的线程,则创建一个新的线程。如果服务器负载过重,导致其所有CPU都被充分利用,并且到达的任务更多,则会创建更多线程,这只会使情况变得更糟。
因此,在负载繁重的生产服务器中,最好使用Executors.newFixedThreadPool,,它为您提供一个具有固定线程数的池,或者直接使用类,以获得最大的控制。“
发布于 2015-09-07 01:41:01
如果您查看the source code,您将看到,它们在内部调用ThreadPoolExecutor.并设置其属性。您可以创建您的一个,以更好地控制您的需求。
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}https://stackoverflow.com/questions/949355
复制相似问题