2016-03-07 215 views
2

我有一个需求,我需要处理当前的现场演出一些任务。 这是一个计划任务,每分钟运行一次。Executors.newFixedThreadPool() - 这个操作有多昂贵

在一分钟之内,可以有任意数量的现场表演(虽然数量不能说大,约最多10)。 所有现场演出需要完成超过20项功能。或者说有20个工人班,那里都有工作

让我们来说说第一个功能,有5个节目,然后几分钟后显示减少到2,然后几分钟后再显示增加到7

目前,我做这样的事情,

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

上述语句被执行的每一分钟。

问题陈述

1)上面的操作多少昂贵是..?。在每个给定的分钟创建fixedThreadPool。

2.)我可以做什么来优化我的解决方案,我应该使用固定线程池,例如(10),也许3或5或6或任何数量的线程在任何给定的时间使用。

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

仅供参考,使用Java8,如果有更好的方法可用。

+0

你为什么每分钟都重新创建一个新的'ExecutorService'?是不是可以实施一次(在启动时)并且每次重复使用它? – Spotted

+0

@斑点我有20名工人,每个工人都有自己的工作,我想为所有工人创造独立的泳池 - 我应该..?如果我为所有工人创建共用池,可能是我工作人员消耗更多线程的情况,所有工人都会每分钟启动一次,可能会出现这样一种情况,即我的一名工人没有任何线程。 –

+0

为什么不使用单个可调整大小的池('Executors.newCachedThreadPool')? – apangin

回答

3

上述操作需要多少钱.. ??在每个给定的分钟创建fixedThreadPool。

创建线程池是一个相对昂贵的操作,可能需要几十毫秒。你不希望每秒钟都这么做。

第二个是电脑的永恒,如果你有一个36核心的机器,它可以在这段时间内执行多达1000亿条指令。一分钟是非常非常长的一段时间,如果你每分钟只做一件事,你甚至可以每分钟重新启动一次JVM,并且仍然可以获得合理的吞吐量。

我该如何优化我的解决方案,我应该使用固定的线程池,例如(10),也许3或5或6或任何数量的线程在任何给定分钟使用。

可能,这取决于你在做什么。没有大多数分析,你可以肯定地说。注意:如果您使用的是parallelStream(),如果不是,您应该看看是否可以,您可以使用内置的ForkJoinPool.commonPool()而不需要创建另一个池。但是,这又取决于你在做什么。