我有下面的代码片段,它运行良好。但问题是它创建并将执行器队列上的2000多个任务放在了一边。如何不压垮java executorservice任务队列?
我需要检查执行程序队列中的任务是否已完成,然后才能给它更多的任务。它不一定是确切的,即如果队列有剩余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);
}
好的约翰。它会被推荐用来捕获和处理'RejectedExecutionException',或者小心你的信号值小于阻塞队列的限制(如果有的话)。 – Gray 2012-07-19 21:14:35
另外信号量(10)不是最大排队的数量,它是正在运行的+排队的数量。 – Gray 2012-07-19 21:15:41
@格雷你说的都对,好点。我以此为起点,但如果OP要实施这些建议,则应考虑这些建议。 – 2012-07-19 21:22:19