执行器服务,避免任务队列过满的标准方法
2022-09-01 06:01:14
我正在使用并发多线程程序的便利性。取以下代码:ExecutorService
while(xxx) {
ExecutorService exService = Executors.newFixedThreadPool(NUMBER_THREADS);
...
Future<..> ... = exService.submit(..);
...
}
在我的情况下,问题是如果所有人都被占用,就不会阻塞。结果是 Task 队列被许多任务淹没。这样做的结果是,关闭执行服务需要很长时间(在很长一段时间内都是错误的)。原因是任务队列仍然很满。submit()
NUMBER_THREADS
ExecutorService.shutdown()
ExecutorService.isTerminated()
现在,我的解决方法是使用信号量来禁止在任务队列中有许多条目:ExecutorService
...
Semaphore semaphore=new Semaphore(NUMBER_THREADS);
while(xxx) {
ExecutorService exService = Executors.newFixedThreadPool(NUMBER_THREADS);
...
semaphore.aquire();
// internally the task calls a finish callback, which invokes semaphore.release()
// -> now another task is added to queue
Future<..> ... = exService.submit(..);
...
}
我确信有更好的更封装的解决方案?