[英]Is there a default thread pool in java
我可以在java中创建一个新的线程池,并使用ExecutorService.newFixedThreadPool和ExecutorService.submit方法在其上执行任务。
是否有一个'默认'线程池,我可以在我的java程序中重用所有执行器服务? 或者我只需要创建一个包含默认线程池的单例? C#有一个默认的线程池,在调用Task.Factory.StartNew方法时运行任务。
从Java-8开始,有ForkJoinPool.commonPool()
,默认情况下由许多涉及并行或异步执行的方法使用。 例如, Arrays.parallelSort()
或并行Stream API操作使用此池。 您可以使用CompletableFuture
类的许多方法(如CompletableFuture.supplyAsync()
将您自己的任务提交到此池。
使用单独的线程池是好的,默认做法,共享线程池是一种(可能是过早的)优化。
通过Java 7,答案是否定的,没有默认的线程池,建议使用多个线程池。 这是一个很好的分离,可以防止一个任务集合上的阻塞行为干扰另一个任务。
如果您共享线程池,您应该提出以下问题:
也许你创建类似LightweightThreadpool
东西。 您编写的前5个任务以轻量级方式使用它。 第六个任务......确实如此,除了它还将错误写入磁盘,这些错误非常大,有时会有很多错误,并且它们没有被限制。 突然之前,前5个任务都饿死了,不知道是什么击中了它们,而且,当你编写这些任务时,你真的相信它们是安全的,可能没有为这类事件做好准备。
因此,共享线程池就好了,因为在同一台服务器上运行两个不同的进程是可以的。 您应该首先仔细考虑资源管理,并了解这些任务现在是资源耦合的。 缺省默认的线程池试图强制您默认使用单独的线程池,并在共享之前仔细考虑这些问题。
从Java 8开始,答案是肯定的(根据Tagir对这个问题的回答 )。 但是如果你向该线程池提交阻塞任务,你会发现一切都会开始可怕的失败。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.