- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一个程序可以生成线程 (~5-150) 来执行一堆任务。最初,我使用 FixedThreadPool
因为 this similar question建议它们更适合生命周期更长的任务,并且由于我对多线程的了解非常有限,我认为线程的平均生命周期(几分钟)“long living”。
但是,我最近添加了生成额外线程的功能,这样做使我超出了我设置的线程限制。在这种情况下,最好是猜测并增加我可以允许的线程数还是切换到 CachedThreadPool
这样我就不会浪费线程了?
初步尝试它们,似乎没有区别,所以我倾向于使用 CachedThreadPool
只是为了避免浪费。但是,线程的生命周期是否意味着我应该选择一个 FixedThreadPool
并只处理未使用的线程? This question看起来那些额外的线程并没有被浪费,但我会很感激你的澄清。
最佳答案
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
确实有它的优势,当您实际上想要使用固定数量的线程时,您可以在知道线程数量的同时向执行器服务提交任意数量的任务线程将保持在您指定的级别。如果您明确想要增加线程数,那么这不是合适的选择。
然而,这确实意味着 CachedThreadPool
可能遇到的一个问题是关于限制并发运行的线程数。 CachedThreadPool
不会为您限制它们,因此您可能需要编写自己的代码以确保不会运行太多线程,您可以通过实例化自己的 ThreadPoolExecutor 相对轻松地做到这一点
具有您想要的行为特征。这实际上取决于您的应用程序的设计以及如何将任务提交给执行器服务。
关于java - FixedThreadPool 与 CachedThreadPool : the lesser of two evils,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17957382/
我需要做一些多线程工作,我使用 ExecutorService.newCachedThreadPool() 并提交一些从队列中检索到的作业。 public class ContentParser {
我正在玩线程,但我不明白为什么这没有像我想象的那样工作。 我正在尝试使用线程计算总和,并期望线程池在打印结果时等待所有任务完成(由于 shutdown() 调用和 isTermination() 检查
我对我的应用程序进行了负载测试,以找出支持计划负载所需的最大线程数。 我使用了 ExecutorService CachedThreadPool 以便根据负载动态创建线程。现在我使用 getLarge
我想知道在这个特定场景中使用哪个 CachedThreadPool 或 FixedThreadPool。当用户登录到应用程序时,将获得大约 10 个地址的地址列表。我需要执行以下操作: 将地址转换为我
下面的线程每 12-24 小时运行一次,我不希望池中有空闲线程。当前代码是: private final ScheduledExecutorService scheduler = Executors.
想象一个需要时间的软件,它接收一堆文本文件(每个 100+ MB),处理它们并放入数据库。我试图通过利用更多核心(这台机器恰好是 8 个,带有超线程的四核 i7)来对其进行一些优化。 考虑以下代码:
我们正在使用通过 ExecutorService#newCachedThreadPool 创建的 CachedThreadPool。 (Java 1.6)。我们在代码的其他地方遇到错误:“无法创建新的
我目前有执行以下操作的代码: private final static ExecutorService pool = Executors.newCachedThreadPool(); public v
我在 CodeReview 中问过这个问题,但它已关闭。 对于一项学校作业,我必须创建 54 个从 Executors.newCachedThreadPool() 同时运行的线程。写入 JTextAr
我有一个服务器,它不断监听客户端连接,并在每次客户端连接时创建一个新线程来处理该客户端的 I/O。现在,我有多个实现 Runnable 的类,并且在 run 方法中有一个 while 循环,该循环一直
这是缓存的线程池: new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue()
我有许多任务,对于大多数任务,我想以不同的速率定期执行。不过,有些任务可能会安排同时执行。此外,一个任务可能需要在另一个任务当前正在执行时开始执行。 我还想通过为每个任务设置一个对象来自定义每个任务,
这个问题在这里已经有了答案: Implementation of BlockingQueue: What are the differences between SynchronousQueue a
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题吗? 更新问题,以便 editing this post 提供事实和引用来回答它. 关闭 8 年前。 Improve
我有一个程序可以生成线程 (~5-150) 来执行一堆任务。最初,我使用 FixedThreadPool 因为 this similar question建议它们更适合生命周期更长的任务,并且由于我对
我是一名优秀的程序员,十分优秀!