我有 ConcurrentLinkedDeque 用于同步推送/弹出元素,我有一些异步任务从堆栈中取出一个元素,如果这个元素有邻居,它会将它推入堆栈。
示例代码:
private ConcurrentLinkedDeque<Item> stack = new ConcurrentLinkedDeque<>();
private ExecutorService exec = Executors.newFixedThreadPool(5);
while ((item = stack.pollFirst()) != null) {
if (item == null) {
} else {
Runnable worker = new Solider(this, item);
exec.execute(worker);
}
}
class Solider{
public void run(){
if(item.hasNeighbors){
for(Item item:item.neighbors){
stack.push(item)
}
}
}
}
我想在 while 循环中有额外的语句来回答这个问题——“Executor 中的任何任务都在工作吗?”
原文由 user4129715 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果您使用
ExecutorService.execute(Runnable)
,则没有一种干净的方法来检查是否所有 Runnable 都已完成。除非你在 Runnable 本身中建立一个机制来这样做(我认为这很草率)。反而:
使用
ExecutorService.submit(Runnable)
。此方法将返回Future<?>
是Runnable
结果的句柄。使用 Futures 提供了一种检查结果的简洁方法。您所要做的就是维护您提交的 Futures 列表,然后您可以遍历整个 Futures 列表,并且:
A)等待所有期货以阻塞方式完成或
B)检查是否所有期货都以非阻塞方式完成。
这是一个代码示例: