我们正在做一些需要外部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。如果调度器中没有容量并且父任务被启动,我们希望它在调用提交并尝试调度的线程中运行。这将通过减慢调用者的速度来给我们一个自动油门机制。
谢了陶德
>
您可以使用第三个构造函数:
ForkJoinPool(int并行,ForkJoinPool. ForkJoinWorkerThreadFactory工厂,Thread.UncaughtExceptionHandler处理程序,布尔asyncMode)
不。但开源软件的好处是您可以创建自己的副本并以任何您想要的方式对其进行修改。
关于您的第一个查询:
您可以如下实现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构造函数中传递这个Factory
ForkJoinPool(int parallelism,
ForkJoinPool.ForkJoinWorkerThreadFactory factory,
Thread.UncaughtExceptionHandler handler,
boolean asyncMode)
关于您的第二个查询:
ForkJoinPool
不提供控制工作队列大小的灵活性。