Java 中拥有多个线程池有哪些优点和缺点?我见过代码中有多个线程池用于不同“类型”的任务,我不确定它是更好的设计还是只是开发人员懒惰。一个例子是使用调度线程池执行器 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.html对于定期执行或有超时的任务,并使用另一个 ThreadPoolExecutor 来执行其他任务。
拥有单独的专用线程池的目的是为了使某个活动不会因为其他活动占用了所有线程而缺乏线程。如果某个服务有自己的线程池,那么它就可以保证有一定数量的线程可供使用,并且它对其他服务的需求并不那么敏感。
操作系统线程是有限的资源。如果您有一个将线程用于不同目的的应用程序,其中一些线程可能会变得繁忙并让大量线程为它们工作,或者某些服务可能存在错误,在某些情况下线程不会返回到池中。如果一个线程发生这种情况,则相同的情况可能适用于所有线程,并且可以通过这种方式耗尽整个线程池。 (《Release It!》一书中早期有一个示例,描述了数据库正在切换的情况,并且编写糟糕的 JDBC 代码导致了这样的泄漏。)
使用多个专用线程池,如果某个服务需要太多线程,那么它必须等待线程可用,从而向系统引入背压,使其逐渐降级,并且由于其他部分有自己的线程池,因此它们有机会赶上他们的部分。因此,我们的想法是,随着负载变化,系统应该具有更稳定的特性。在您描述的情况下,为计划任务使用单独的线程池可确保无论系统的其余部分有多忙,这些任务都能运行。
多个线程池需要进行调整,以确保每个池有足够的线程而不是太多。使用单个线程池可能会减少空闲线程的数量,并可能更好地利用更多线程,但您无法预测某些重要任务是否会获得及时完成所需的线程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)