当前位置: 首页 > 知识库问答 >
问题:

FixedThreadPool与CachedThreadPool:两害相权取其轻

谢飞舟
2023-03-14

我有一个程序,它产生执行一系列任务的线程(~5-150)。最初,我使用fixedthreadpool,因为这个类似的问题表明它们更适合更长时间的任务,而且由于我对多线程的知识非常有限,我认为线程的平均寿命(几分钟)是“长寿命”的。

但是,我最近添加了生成额外线程的功能,这样做使我超过了我设置的线程限制。在这种情况下,是猜测并增加我可以允许的线程数,还是切换到cachedthreadpool,这样就不会浪费线程?

初步尝试了这两种方法,似乎没有什么不同,所以我倾向于使用CachedThreadPool,以避免浪费。但是,线程的生命周期是否意味着我应该选择fixedthreadpool并只处理未使用的线程?这个问题使它似乎那些额外的线程没有浪费,但我希望澄清。

共有1个答案

年风华
2023-03-14

cachedthreadpool似乎适合您的情况,因为直接对长时间运行的线程使用cachedthreadpool不会产生负面影响。java文档中关于CachedThreadPools适合于短任务的注释只是表明它们特别适合于这种情况,而不是说它们不能用于长时间运行的任务。

cachedthreadpool的主要问题是,它将创建最多integer.max_value线程数,因为如果缓存中不存在未使用的线程,它将始终生成一个新线程。因此,如果您有长时间运行的任务,那么更有可能增加比您期望的更多的并发线程数量,因为这种类型的线程池本身不会限制并发执行的线程数量。正如所描述的,这对于您的用例来说似乎不是一个问题,但这是需要注意的。

为了进一步说明cachedthreadpoolfixedthreadpool之间的区别,executors.newcachedthreadpool和executors.newfixedthreadpool都通过threadpoolexecutor的实例由相同的线程池实现(至少在开放的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确实有它的优点,因为当您确实想要使用固定数量的线程时,您可以向executor服务提交任意数量的任务,同时知道线程数量将保持在您指定的级别。如果您显式地希望增加线程数,那么这不是合适的选择。

但是,这确实意味着CachedThreadPool可能遇到的一个问题是限制并发运行的线程数量。CachedThreadPool不会对它们进行限制,因此您可能需要编写自己的代码以确保不会运行太多线程,通过使用所需的行为特征实例化自己的ThreadPoolExecutor可以相对轻松地实现这一点。这实际上取决于应用程序的设计以及如何将任务提交给executor服务。

 类似资料:
  • 问题内容: 我有一个程序产生线程(〜5-150)来执行一堆任务。最初,我使用a,因为这个类似的问题表明它们更适合寿命更长的任务,并且由于我对多线程的了解非常有限,我认为线程的平均寿命(几分钟)是“ 寿命长 ”的。 但是,我最近添加了产生更多线程的功能,并且这样做使我超出了我设置的线程限制。在这种情况下,最好猜测并增加我可以允许的线程数,或者切换到a 以便没有浪费的线程? 初步尝试将它们都尝试一下,

  • 我试图通过DP找到所有子数组的加权平均值,然后按列排序,找到长度相同的2。但我无法继续下去,我的方法似乎太模糊/太粗暴了。我将非常感谢任何帮助。提前谢了。

  • 本文向大家介绍浅谈Python中eval的强大与危害,包括了浅谈Python中eval的强大与危害的使用技巧和注意事项,需要的朋友参考一下 eval是Python的一个内置函数,这个函数的作用是,返回传入字符串的表达式的结果。想象一下变量赋值时,将等号右边的表达式写成字符串的格式,将这个字符串作为eval的参数,eval的返回值就是这个表达式的结果。 python中eval函数的用法十分的灵活,但

  • 概述 IoT系统使用OAtuh2协议进行接入与授权操作。原生的OAuth2支持Authenticatoin Code,Password,Client Credentials,Implicit四种授权模式。IoT系统扩展了OAuth2协议,以支持更多的接入方式,如基于微信登录的js_code模式,基于短信或邮件验证码的captcha模式。具体来讲,IoT系统支持以下授权模式: Js Code 适用于

  • 我需要做一些多线程工作,并使用ExecutorService。newCachedThreadPool()并提交从队列中检索到的一些作业。 所以每个线程都创建一个的新实例,我在其中做一些工作。 我从另一个类调用我的,所以在提交所有作业后,我这样做: 但它只会杀死我的线程,即使工作没有完成,也没有等待。 也许是因为我在每个线程中创建了一个新的实例?

  • 目前在我的团队的web应用程序中,我们在一个名为Auth:“dfdfdf ...”的头中传递访问令牌.我们使用AWS Lambda和令牌授权器来访问我们的API网关资源。 还有一种不同类型的承载令牌头:授权:承载:通过Javascript发送授权令牌承载 区别是专有/命名,还是亚马逊的令牌授权人在功能上与承载令牌模式不同?