【问题标题】:Limiting the Q size on Java's 1.7 ForkJoinPool限制 Java 1.7 ForkJoinPool 的 Q 大小
【发布时间】:2014-09-27 23:02:00
【问题描述】:

我们正在执行一些需要外部 I/O 并且是递归的任务。为了实现这一点,我们正在对从旧的 ExecutorService 切换到 ForkJoinPool 进行原型设计。我们的并行度显然会高于我们的内核数量,因为我们将把线程的大部分时间花在 I/O 等待上。我们只有同步网络 API,所以这里没有其他选项。

在旧的 ExecutorService 中,您可以通过设置队列大小来拒绝任务,以免它们堆积。在 ForkJoinPool 中,这似乎是不可能的,而且它似乎在 Oracle 1.7 实现中扩展到了这个值。

/**
 * Maximum size for submission queue array. Must be a power of two
 * less than or equal to 1 << (31 - width of array entry) to
 * ensure lack of index wraparound, but is capped at a lower
 * value to help users trap runaway computations.
 */
private static final int MAXIMUM_QUEUE_CAPACITY = 1 << 24; // 16M

这是我们想要的更大的队列。是否有具有以下功能的 fork/join pool 实现?

1) 提供一种在创建线程时命名线程的工具的能力?我们有几个 I/O 工作池,它有助于调试查看哪个池创建并拥有线程。

2) 提供设置最大队列大小的功能。在调度父任务时,我们实际上希望它为 0。如果调度器中没有容量并且父任务已启动,我们希望它在调用提交并尝试调度的线程中运行。这将通过减慢调用者的速度为我们提供自动节流机制。

谢谢, 托德

【问题讨论】:

    标签: java multithreading fork-join forkjoinpool


    【解决方案1】:
    1. 你可以使用第三个构造函数:

      ForkJoinPool(int parallelism, ForkJoinPool.ForkJoinWorkerThreadFactory factory, Thread.UncaughtExceptionHandler handler, boolean asyncMode)

    2. 没有。但开源软件的好处在于您可以创建自己的副本并以任何您想要的方式对其进行修改。

    【讨论】:

      【解决方案2】:

      关于您的第一个查询:

      您可以如下实现ThreadFactory

      class SimpleThreadFactory implements ThreadFactory {
         String name;
      
         public SimpleThreadFactory (String name){
             this.name = name;
         }
         public Thread newThread(Runnable r) {
              return new Thread(r,name);
         }
       }
      

      你可以在 ForkJoinPool 构造函数中传递这个工厂

      ForkJoinPool(int parallelism,
                  ForkJoinPool.ForkJoinWorkerThreadFactory factory,
                  Thread.UncaughtExceptionHandler handler,
                  boolean asyncMode)
      

      关于您的第二个查询:

      ForkJoinPool 不提供控制工作队列大小的灵活性。

      【讨论】:

        猜你喜欢
        • 2014-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-01
        • 2013-04-25
        • 1970-01-01
        • 2018-09-20
        • 2011-11-21
        相关资源
        最近更新 更多