如何使用ExecutorService以创建一个中央线程池,该线程池在应用程序级别上设置,其池大小根据该时刻CPU可用的线程数进行设置,然后应用程序的不同功能根据自己的要求从该中央池中使用线程。
如何使用ExecutorService以创建一个中央线程池,该线程池在应用程序级别上设置,其池大小根据该时刻CPU可用的线程数进行设置,然后应用程序的不同功能根据自己的要求从该中央池中使用线程。
从Java 8开始,我建议您使用ForkJoinPool.commonPool()
。这是Java提供的唯一全局线程池。
在Java 8之前,您可以保留自己的线程池或使用框架共享的线程池。
一个中央线程池?
也许,这就像是设计模式中的单例模式,我认为它可以解决你的问题。
根据可用于 CPU 的线程数量设置?
线程池的大小并非精确。在实践中,大小取决于要由线程池执行的任务类型。例如,如果任务是CPU密集型的,则大小可以为Runtime.getRuntime().availableProcessors() + 1
,如果任务是I/O密集型的,则大小可以为Runtime.getRuntime().availableProcessors() * 2
。但这些只是基本原则,您应该通过使用一些指南(如Little's_law)测试您的应用程序来确定适当的大小;
我的建议:
在实践中,我很少将所有任务提交给一个中央线程池,可能应该按类型对任务进行分组,将它们提交到不同的线程池,这样以后监视或调整线程池会更方便。
ExecutorService
,使其成为单例(可能使用依赖注入)? - user180100Runtime.getRuntime().availableProcessors();
来获取处理器数量,但我不建议这样做。最好通过对代码进行分析来找到最佳线程数。 - Pravin Sonawane