当前位置: 首页 > 面试题库 >

FixedThreadPool与CachedThreadPool:两种弊端中的较小者

何修能
2023-03-14
问题内容

我有一个程序产生线程(〜5-150)来执行一堆任务。最初,我使用a,FixedThreadPool因为这个类似的问题表明它们更适合寿命更长的任务,并且由于我对多线程的了解非常有限,我认为线程的平均寿命(几分钟)是“ 寿命长
”的。

但是,我最近添加了产生更多线程的功能,并且这样做使我超出了我设置的线程限制。在这种情况下,最好猜测并增加我可以允许的线程数,或者切换到a
CachedThreadPool以便没有浪费的线程?

初步尝试将它们都尝试一下,似乎没有 什么
区别,所以我倾向于选择CachedThreadPool正义以避免浪费。但是,线程的寿命是否意味着我应该改而选择a
FixedThreadPool并只处理未使用的线程?这个问题使这些多余的线程似乎没有浪费,但我希望您能澄清一下。


问题答案:

CachedThreadPool正是您应使用的情况,因为长时间运行线程不会使用CachedThreadPool。Java文档中有关CachedThreadPools适用于短期任务的评论仅表明它们特别适合此类情况,而不是它们不能或不应用于涉及长时间运行任务的任务。

为了进一步阐述,Executors.newCachedThreadPool和Executors.newFixedThreadPool都由相同的线程池实现(至少在开放的JDK中)支持,只是具有不同的参数。区别只是它们的线程最小值,最大值,线程终止时间和队列类型。

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>());
}

当您确实想使用固定数量的线程时,FixedThreadPool确实具有其优势,因为从那时起,您可以向执行程序服务提交任意数量的任务,同时知道线程数将保持在指定的级别。如果您明确希望增加线程数,那么这是不合适的选择。

但是,这确实意味着CachedThreadPool可能存在的一个问题是限制同时运行的线程数。CachedThreadPool不会为您限制它们,因此您可能需要编写自己的代码以确保您不会运行太多线程。这实际上取决于您的应用程序的设计以及如何将任务提交给执行者服务。



 类似资料:
  • 我有一个程序,它产生执行一系列任务的线程(~5-150)。最初,我使用,因为这个类似的问题表明它们更适合更长时间的任务,而且由于我对多线程的知识非常有限,我认为线程的平均寿命(几分钟)是“长寿命”的。 但是,我最近添加了生成额外线程的功能,这样做使我超过了我设置的线程限制。在这种情况下,是猜测并增加我可以允许的线程数,还是切换到,这样就不会浪费线程? 初步尝试了这两种方法,似乎没有什么不同,所以我

  • 我正在开发一个语音信息应用程序,我需要比较两个声音, 通过录制语音向应用程序注册 通过录制语音向另一用户发送语音信息,但首先需要将此语音与配置文件中录制的语音进行比较 出于安全目的,需要知道记录的消息是否来自特定用户。 我试过了: 比较Android中的两种声音 http://www . dream incode . net/forums/topic/274280-using-FFT-to-com

  • 我有以下几点: 上面的代码不起作用。以上问题还有其他解决方案吗? 格式化日期按我在哪里可以找到留档格式化日期在JavaScript?也dint为我工作。

  • 问题内容: 我正在考虑启动一个项目,该项目用于使用批注在Java中生成代码(我不会详细介绍,因为它并不重要)。我对项目的有效性和实用性感到好奇,令我震惊的是对Annontation Processor Tool(apt)的依赖。 我无法从经验中得知,我想知道的是在Java中使用注释处理的缺点是什么? 这些可以是任何东西,包括以下各项: 写处理器时很难做TDD 很难将处理包含在构建系统中 处理需要很

  • std::any没有运算符== 是我错过了一些明显的东西还是我需要真正的谋生? 有没有一些简单的方法来提供运营商? https://godbolt.org/z/rdowrcnts