【问题标题】:Handling Thread pool isolation?处理线程池隔离?
【发布时间】:2015-03-23 15:07:47
【问题描述】:

目标

想了解java中如何同时处理两个线程池?


考虑一个客户端服务器系统,其中客户端向服务器(例如文件服务器)发送阻塞 I/O 请求。服务器上运行着一个 ThreadPoolExecutor 实例。某些类型的客户端请求比其他请求需要更长的时间来处理。这些请求称为高 I/O 强度请求。这些高 I/O 强度的请求会占用所有线程并关闭整个应用程序。


我想通过两个独立的 ThreadPoolExecutor 来解决这个问题。 我创建了两个 ThreadPoolExecutor 实例,一个用于高 I/O 强度请求,另一个用于低 I/O 强度请求,并通过离线工作负载过程创建一个查找表来对请求进行分类,当请求到达时,我首先在查找中搜索其类表,以便我可以将其移交给其对应的线程池。


真正的问题。 如何将处理器平均分配给这两个线程池。这个任务是由 JVM 自己处理还是我必须在应用程序级别自己处理? 我应该使用集群并使用另一台运行 ThreadPoolExecutor 实例的机器来处理高 I/O 强度请求吗? 请给我适当的设计建议。

【问题讨论】:

  • 你无法决定有多少资源被处理给线程,这是内核的决定,而不是你的(幸运的是)。但是你可以给线程优先级。
  • 你看过 Kabutz 教授的 Striped Executor - 看起来它可以满足你的需求 - 或者至少是它的一个变体。

标签: java multithreading threadpool hazelcast threadpoolexecutor


【解决方案1】:

不,JVM 无法为您路由 ThreadPoolExecutor。您可以实现一个外部观察者线程来监控您的线程并向它们应用适当的策略(优先级、异常处理等)。

看看这个例子:

http://tutorials.jenkov.com/java-multithreaded-servers/thread-pooled-server.html

【讨论】:

    【解决方案2】:

    通常取决于系统 CPU 调度程序如何在线程之间分配时间。线程池与线程调度无关。它可以管理它们之间的一些线程重用或同步。

    创建 2 个池而不是 1 个的唯一优点是,一个池可以使用不同于标准 Executors.defaultThreadFactory() 的 ThreadFactory。您可以为要求苛刻的客户提供不同的优先级。优先权是一种信息,但如果你让它们不那么重要或反之亦然,他们会遭受更大的痛苦;)

    当有人使用太多资源时,也许您更愿意做一些事情,比如调整它的优先级。

    Here 是一些参考微软如何使用优先级来调整线程 CPU 消耗。

    【讨论】:

      猜你喜欢
      • 2013-02-01
      • 1970-01-01
      • 2011-11-03
      • 2021-08-28
      • 1970-01-01
      • 2015-02-19
      • 1970-01-01
      • 2018-07-19
      • 2012-03-31
      相关资源
      最近更新 更多