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
Java 每个应用程序有一个(较大)线程池,而每个应用程序组件有多个(较小)线程池_Java_Multithreading_Performance_Threadpool_Maintenance - Fatal编程技术网

Java 每个应用程序有一个(较大)线程池,而每个应用程序组件有多个(较小)线程池

Java 每个应用程序有一个(较大)线程池,而每个应用程序组件有多个(较小)线程池,java,multithreading,performance,threadpool,maintenance,Java,Multithreading,Performance,Threadpool,Maintenance,一个应用程序承载一个web服务,该服务具有三个接口,用于三个单独和独立的操作,所有这些操作都在应用程序的不同组件中实现,彼此独立,例如在不同的软件包中等,因此它们彼此不太了解,只共享应用程序范围内的配置等 每个用户使用多个数据调用所有这些接口,并且能够至少部分独立地处理这些数据,这就是为什么我目前使用三个线程池进行处理,每个组件一个线程池 原因是,通过这种方式,每个线程池都可以独立优化,这取决于要处理的对象的负载和用途,并且已知用于哪个目的等。但在实践中,目前没有一个线程池关心这些对象,而是使用

一个应用程序承载一个web服务,该服务具有三个接口,用于三个单独和独立的操作,所有这些操作都在应用程序的不同组件中实现,彼此独立,例如在不同的软件包中等,因此它们彼此不太了解,只共享应用程序范围内的配置等

每个用户使用多个数据调用所有这些接口,并且能够至少部分独立地处理这些数据,这就是为什么我目前使用三个线程池进行处理,每个组件一个线程池

原因是,通过这种方式,每个线程池都可以独立优化,这取决于要处理的对象的负载和用途,并且已知用于哪个目的等。但在实践中,目前没有一个线程池关心这些对象,而是使用合理的默认值。这意味着每个线程池仅限于5个线程。如果需要所有池/线程,则可以不在系统上施加太多负载,但如果不需要,则10核CPU的某些核心可能未使用,即使一个用户提供的数据可以由7/8/N核并行处理。另一方面,当前的行为在某种程度上“保证”了,如果不做其他事情,每个任务至少有5个线程可用

因此,为了更动态地使用资源,每个应用程序始终只有一个线程池(例如10个或15个或任意N个线程)比独立的线程池更好吗

或者这是什么?没有明确的答案,因为这类事情通常取决于许多变量,如系统的总体负载,例如备份、cron报告、监控事件和安装更新等,有多少用户调用了哪些接口等等


我的问题有点类似,但不是重复的,因为它不关注一个具体的任务,而是整个应用程序及其可维护性。这只是我反复问自己的一个问题,例如,当我最初只有一个线程池时,甚至可能在添加10个线程池时。

正如我所见,拆分为多个线程池有三个原因。这两种方法可能都不适用于您的用例

  • 控制:如果您有一些优先级较高的任务,并且希望增加这些任务运行的机会。您可以创建多个线程池,并为优先级较高的线程提供更多线程

  • 争用:正在运行多少任务?任务的执行速度有多快?如果答案是多且快,那么拥有一个线程池可能会导致单个工作队列上的争用。相反,您可以对线程池进行条带化,并在线程池之间拆分争用。这本质上就是ForkJoinPool所做的,每个线程都有自己的工作队列,并以这种方式减少争用(也许您可以使用FJP)

  • 您不希望应用程序某个部分的任务干扰应用程序另一个不相关部分的任务。想象一下,如果你有一个动作A需要一段时间,而另一个动作B不需要。打破这些限制是有意义的,这样线程池就不会被所有正在运行的任务占用。它与(1)更多的控制和(2)减少竞争有某种联系

  • 否则,我认为创建的线程池和线程的数量是任意的


    编辑:添加了第三个用例

    似乎对此没有明确的答案。我想知道这个web服务是否应该是三个web服务,但没有办法真正回答这个问题3个web服务,又称3个应用程序,又称3个池?最终每个应用程序都会有一个池。。。在我的例子中,这些web服务实际上形成了一个应用程序,它只提供许多不同的web服务。