Executors.newFixedThreadPool() - 这个操作有多昂贵?

3

我有一个需求,需要处理一些当前正在播放的直播节目的任务。这是一个定时任务,每分钟运行一次

在任何一个给定的分钟内,可能会有任意数量的直播节目(虽然数量不会很大,最多约为10个)。 所有直播节目需要完成20多项功能。或者说,有20个工作类,所有类都在进行他们的工作

例如,对于第一个功能,有5个直播节目,然后几分钟后,直播节目减少到2个,然后几分钟后,又增加到7个

目前我正在做如下操作:

int totalShowsCount = getCurrentShowsCount();
ExecutorService executor = Executors.newFixedThreadPool(showIds.size());

以上语句每分钟执行一次。

问题陈述

1.) 上述操作有多昂贵?每分钟创建一个fixedThreadPool。

2.) 我该如何优化我的解决方案?我应该使用一个固定的线程池,比如(10),在任何给定的时间可能会使用3或5或6或任意数量的线程。

我可以在工作人员级别创建一个固定的线程池,并维护它并利用它。

顺便提一下,如果有更好的方法可用,使用Java8。


为什么你每分钟都要重新创建一个新的ExecutorService?难道不可能在启动时实例化它一次并在每次重用它时重复使用吗? - Spotted
@Spotted 我有20个工人,每个工人都有自己的工作,我想为所有工人创建单独的池-我应该这样做吗?如果我为所有工人创建共同的池,可能会出现一个情况,即一个工人消耗更多的线程,所有工人将在每分钟开始,可能出现一个情况,其中一个工人没有任何线程可用。 - Ankur Singhal
为什么不使用单个可调整大小的池(Executors.newCachedThreadPool)? - apangin
1个回答

4
以上操作的代价非常昂贵。每分钟创建一个固定大小的线程池需要花费几毫秒的时间。您不希望每秒钟执行此操作多次。
对于计算机来说,一秒钟是漫长的时间,如果您有一台36核的机器,它可以在那段时间内执行多达1000亿条指令。一分钟是非常非常长的时间,如果您每分钟只执行一次操作,甚至可以每分钟重新启动JVM并仍然获得合理的吞吐量。
要优化解决方案,您可以使用固定大小的线程池(例如10个),并且在任何给定的一分钟内可能会使用3、5、6或任意数量的线程。但这取决于您正在做什么。如果您正在使用parallelStream(),则可以使用内置的ForkJoinPool.commonPool()而无需创建另一个线程池,但这还是取决于您正在做什么。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接