限制 Java 1.7 ForkJoinPool 上的 Q 大小



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

在旧的ExecutorService中,您可以通过设置队列大小来拒绝任务,这样它们就不会堆积起来。在ForkJoinPool中,这似乎是不可能的,而且它似乎在Oracle1.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池实现?

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

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

谢谢,Todd

  1. 您可以使用第三个构造函数:

    ForkJoinPool(int并行,ForkJoinPool.WorkJoinWorkerThreadFactory工厂,Thread.UncaughtException处理程序,布尔异步模式)

  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不提供控制工作队列大小的灵活性。

相关内容

  • 没有找到相关文章

最新更新