Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用单个线程池比使用多个线程池更好吗_Java_Multithreading_Scheduled Tasks_Java.util.concurrent_Threadpoolexecutor - Fatal编程技术网

Java 使用单个线程池比使用多个线程池更好吗

Java 使用单个线程池比使用多个线程池更好吗,java,multithreading,scheduled-tasks,java.util.concurrent,threadpoolexecutor,Java,Multithreading,Scheduled Tasks,Java.util.concurrent,Threadpoolexecutor,在Java中有多个线程池的优点和缺点是什么?我见过代码中有多个线程池用于不同的“类型”任务,我不确定这是更好的设计还是开发人员懒惰。一个例子是,对于定期执行或有超时的任务,使用一个线程池执行器,而对于其他所有任务,则使用另一个线程池执行器 拥有单独的专用线程池的目的是使一个活动不会因为其他活动占用了所有线程而缺少线程。如果某个服务有自己的线程池,那么可以保证它有一定数量的线程供其使用,并且它对其他服务的需求不那么敏感 有了多个专用线程池,如果一个服务需要太多的线程,那么它必须等待线程可用,这会给

在Java中有多个线程池的优点和缺点是什么?我见过代码中有多个线程池用于不同的“类型”任务,我不确定这是更好的设计还是开发人员懒惰。一个例子是,对于定期执行或有超时的任务,使用一个线程池执行器,而对于其他所有任务,则使用另一个线程池执行器

拥有单独的专用线程池的目的是使一个活动不会因为其他活动占用了所有线程而缺少线程。如果某个服务有自己的线程池,那么可以保证它有一定数量的线程供其使用,并且它对其他服务的需求不那么敏感

有了多个专用线程池,如果一个服务需要太多的线程,那么它必须等待线程可用,这会给系统带来反压力,使其逐渐退化,而且由于其他部分有自己的线程池,它们有机会赶上它们的部分。因此,我们的想法是,随着负载的变化,系统应该具有更稳定的特性。在您描述的为计划任务使用单独线程池的情况下,确保无论系统的其余部分有多忙,这些任务都可以运行


多个线程池需要调整,以确保每个池有足够的线程,而不是太多。使用单个线程池时,您不需要进行调优,有时可能会更好地利用所有线程,但您可能无法预测某些重要任务将及时完成所需的线程。

使用单个线程池不是一个好的设计,因为在使用一个线程池的情况下,如果应用程序的某个部分变慢,线程将集中在那里。如果没有实现适当的超时,线程将停留并消耗资源。很多这样的线程和连接都会导致我们的系统崩溃,因为没有线程可供新请求使用


另一方面,拥有多个线程池可以确保问题得到控制,不会成为系统范围的故障。我们可以使用不同的线程池来接受连接、运行批处理作业、与远程api的数据库通信。它确实在一定程度上降低了效率,但使我们的系统健壮且容错

因此,如果我有4个核心处理器,让我们假设12个大小为4的固定大小线程池,其中一半处理非常CPU密集的任务,java将如何管理这些线程池??当使用多个线程池时,JVM是否有防止饥饿的内置功能,或者我们是否有实现自己的功能???@DeepSidhu1313:JVM没有做任何防止饥饿的事情。我认为说它不是一个好的设计是过于武断的。如果你的应用程序只做一件事,那么这是一个很棒的设计。但是,即使使用异构工作负载,当您添加更多池时,也会变得更难理解,并且会内省地限制您的资源消耗。所以你可能会在物理层挨饿。对于不应该彼此饥饿的工作负载类,使用单独的线程池。但如果是这样的话,您可能应该分割整个服务,并确保它们不会在应用层下饿死。