目标
我想了解如何在java中同时处理两个线程池?
考虑客户端服务器系统,其中客户端向服务器(例如文件服务器)发送阻止I / O请求。在服务器上运行一个ThreadPoolExecutor实例。某些类型的客户端请求比其他请求需要更长的时间来处理。这些请求称为高I / O强度请求。这些高I / O强度请求占用所有线程并关闭整个应用程序。
我想通过两个单独的ThreadPoolExecutor来解决这个问题。 我创建了两个ThreadPoolExecutor实例,一个用于高I / O强度请求,另一个用于低I / O强度请求,并且通过离线工作负载过程,我创建一个查找表来对请求进行分类,当请求到达时,我首先在查找中搜索它的类表,以便我可以将其移交给相应的线程池。
真正的问题。 如何将处理器平均共享到这两个线程池。这个任务是由JVM本身处理还是我必须自己在应用程序级别处理它? 我应该使用集群并使用另一台运行ThreadPoolExecutor实例的机器来处理高I / O强度请求吗? 请给我适当的设计建议。
答案 0 :(得分:0)
通常由系统CPU调度程序决定如何在线程之间分配时间。线程池与线程调度无关。它可以管理一些线程重用或它们之间的同步。
创建2个池而不是1个池的唯一好处是,一个池可以使用与标准Executors.defaultThreadFactory()不同的ThreadFactory。您可以为要求苛刻的客户提供不同的优先级如果你让它们变得不那么重要,反之亦然,那么Prority就是一种信息,但是它们会遭受更多的痛苦;)
当有人使用太多资源时,也许你宁可做一些调整它的优先事项。
Here是一些参考,Microsoft如何使用优先级来调整线程CPU消耗。
答案 1 :(得分:0)
没有JVM无法为您路由ThreadPoolExecutor。您可以实现一个外部监视程序线程来监视您的线程并对它们应用适当的策略(优先级,异常处理等)。
看一下这个例子:
http://tutorials.jenkov.com/java-multithreaded-servers/thread-pooled-server.html