以下のコード スニペットがあり、正常に動作します。しかし、問題は、2000 を超えるタスクをすぐに作成してエグゼキューター キューに入れることです。
エグゼキューター キューに既にあるタスクが完了しているかどうかを確認する必要があります。その後、追加のタスクを与えます。正確である必要はありません。つまり、キューに残っているタスクが 10 個未満の場合は、さらに 50 個追加します。
そのため、エグゼキュータ タスク キューには保留中のタスクがそれほど多くないため、shutdown() をタイムリーに動作させることもできます。それ以外の場合は、呼び出されたとしても、エグゼキュータはキュー内の 2000 個のタスクすべてを最初に完了しようとします。
これを達成するための最良の方法は何ですか?ありがとうございました
executor = Executors.newFixedThreadPool(numThreads);
while(some_condition==true)
{
//if(executor < 10 tasks pending) <---- how do i do this?
//{
for(int k=0;k<20;k++)
{
Runnable worker = new MyRunnable();
executor.execute(worker);
}
//}
//else
//{
// wait(3000);
//}
}
セマフォを使用して更新します。
private final Semaphore semaphore = new Semaphore(10)
executor = new ThreadPoolExecutorWithSemaphoreFromJohnExample();
while(some_condition==true)
{
Runnable worker = new MyRunnable();
//So at this point if semaphore is full, then while loop would PAUSE(??) until
//semaphore frees up again.
executor.execute(worker);
}