1

ExecutorServiceJavaからを使用して次の動作を実現したいと思います。完了する必要のあるタスクが多数あり、それらはすべて並行して実行できます。次の方法で、メインスレッドから一度にN個のタスクのみをスケジュールしたいと思います。

  • アクティブなタスクの数が<N=>の場合、新しいタスクをスケジュールします(エグゼキュータサービスはすでにそれを実行しています)
  • それ以外の場合は、タスクの1つが完了するまでメインスレッドでブロックします=> N個の最初のタスクをキューに格納し、最初のタスクをデキューしてget()を呼び出すのとほぼ同じです)

上記のようにExecutorServiceを微調整する方法はありますか?

4

2 に答える 2

4

SynchronousQueueで構築されたNスレッドのThreadPoolExecutorを使用します。スレッドプールにタスクを送信するたびに、プールのスレッドがキューからタスクを取得するまで、メインスレッドは同期キューによってブロックされます。

于 2012-12-14T16:06:16.213 に答える
0

N個のタスクをExecutorCompletionServiceに送信してから、ループで送信できます。

Future<?> f = executor.take(); //blocks until one task completes
executor.submit(nextTask());

そうすることで、同時にN個を超えるタスクがエグゼキュータでキューに入れられないようにします。

于 2012-12-14T16:36:14.797 に答える