1

外部 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 プールの実装はありますか?

1) 作成時にスレッドに名前を付ける機能を提供する機能は? いくつかの I/O ワーカー プールがあり、どのプールがスレッドを作成して所有しているかをデバッグするのに役立ちます。

2) 最大キュー サイズを設定する機能を提供します。親タスクをスケジュールするときは、実際には 0 にする必要があります。スケジューラに容量がなく、親タスクが開始された場合、サブミットを呼び出してスケジュールを試みるスレッドで実行する必要があります。これにより、呼び出し元の速度が低下することで、自動スロットル メカニズムが提供されます。

ありがとう、トッド

4

2 に答える 2

0

最初のクエリについて:

以下のようにThreadFactoryを実装できます。

class SimpleThreadFactory implements ThreadFactory {
   String name;

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

そして、この Factory を ForkJoinPool コンストラクターに渡すことができます

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

2番目のクエリについて:

ForkJoinPoolワーカー キューのサイズを柔軟に制御できません。

于 2016-01-18T13:39:07.837 に答える