我有一个程序,它产生执行一系列任务的线程(~5-150)。最初,我使用fixedthreadpool
,因为这个类似的问题表明它们更适合更长时间的任务,而且由于我对多线程的知识非常有限,我认为线程的平均寿命(几分钟)是“长寿命”的。
但是,我最近添加了生成额外线程的功能,这样做使我超过了我设置的线程限制。在这种情况下,是猜测并增加我可以允许的线程数,还是切换到cachedthreadpool
,这样就不会浪费线程?
初步尝试了这两种方法,似乎没有什么不同,所以我倾向于使用CachedThreadPool
,以避免浪费。但是,线程的生命周期是否意味着我应该选择fixedthreadpool
并只处理未使用的线程?这个问题使它似乎那些额外的线程没有浪费,但我希望澄清。
cachedthreadpool
似乎适合您的情况,因为直接对长时间运行的线程使用cachedthreadpool不会产生负面影响。java文档中关于CachedThreadPools适合于短任务的注释只是表明它们特别适合于这种情况,而不是说它们不能用于长时间运行的任务。
cachedthreadpool
的主要问题是,它将创建最多integer.max_value
线程数,因为如果缓存中不存在未使用的线程,它将始终生成一个新线程。因此,如果您有长时间运行的任务,那么更有可能增加比您期望的更多的并发线程数量,因为这种类型的线程池本身不会限制并发执行的线程数量。正如所描述的,这对于您的用例来说似乎不是一个问题,但这是需要注意的。
为了进一步说明cachedthreadpool
和fixedthreadpool
之间的区别,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发送授权令牌承载 区别是专有/命名,还是亚马逊的令牌授权人在功能上与承载令牌模式不同?