2016-11-24 50 views
2

如何使用ExecutorService的方式为应用程序级别的应用程序创建一个中央线程池,该线程池的池大小将根据当时CPU可用的线程数设置,然后不同的时间应用程序的功能按照他们的要求使用来自该中央池的线程。Java ExecutorService

+0

围绕'ExecutorService'使用一些自定义的包装,这是一个单例(使用依赖注入也许)? – 2016-11-24 05:42:40

+1

您可以使用'Runtime.getRuntime()。availableProcessors();'来获得处理器的数量,但我不会推荐使用这个。更好地分析代码以找到最佳线程数。 –

+0

如果你正在寻找一种方法来计算你的环境可以支持多少线程..这里是一些..http://stackoverflow.com/questions/763579/how-many-threads-can-a-java-vm-支持 – Sagar

回答

0

从Java 8开始,我建议你使用ForkJoinPool.commonPool()。这是Java提供的唯一全局线程池。

在Java 8之前,您要么保留自己的线程池,要么使用您的框架的可共享线程池。

0

贝娄是我的看法:

  • 中央线程池?

    也许吧,说的Singleton Pattern设计模式,我认为它可以解决你的问题;

  • 根据可用CPU的线程数设置?

    线程池的大小不准确。实际上,大小取决于线程池执行的任务类型。例如,大小可以Runtime.getRuntime().availableProcessors() + 1如果任务CPU密集型,或者是Runtime.getRuntime().availableProcessors() * 2如果任务I/O密集型。但这些都只是基本原则,你应该确定合适的尺寸用一些测试应用程序准则(如Little's_law);

  • 我的建议:

    在实践中,我很少提交所有任务只有一个中心threal池,也许应该组的任务按类型,并将其提交给不同的线程池,这将是方便的监控或稍后调整线程池。

希望能帮到你。

+0

谢谢Haolin!当找到当前的JVM线程数时也有问题: - 需要查找标准阈值 快乐案例:如果JVM线程数小于阈值,那么我们将从线程池中获取线程并处理它。这种情况下没有问题 悲伤情况:如果JVM线程数大于阈值,那么该怎么办? 所以我们需要等到jvm线程冷却下来。如果我们在等待线程,则CPU利用率太高。如果我们继续等待,那么记录过程就会积累起来,并且这将成为性能方面的问题。 – Man