当前位置: 首页 > 面试题库 >

如何检查在ExecutorService上运行的所有任务是否已完成

颜德馨
2023-03-14
问题内容

我有ConcurrentLinkedDeque,它用于同步push /
pop元素,还有一些异步任务,这些任务正在从堆栈中获取一个元素,如果该元素具有邻居,则会将其推入堆栈。

示例代码:

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循环中有另外一条语句来回答问题-“执行程序中的任何任务都在工作?”


问题答案:

如果使用,没有一种干净的方法来检查所有Runnable是否都已完成ExecutorService.execute(Runnable)。除非您在Runnable本身中构建了一种机制来这样做(在我看来这是草率的)。

相反:
使用ExecutorService.submit(Runnable)。此方法将返回a
Future<?>,它是a的结果的句柄Runnable。使用期货提供了一种检查结果的干净方法。

您要做的只是维护您提交的期货列表,然后可以遍历整个期货列表,然后:
A)等待所有期货以封闭方式完成,或者
B)检查是否所有期货以非阻塞方式进行。

这是一个代码示例

List<Future<?>> futures = new ArrayList<Future<?>>();
ExecutorService exec = Executors.newFixedThreadPool(5);

// Instead of using exec.execute() use exec.submit()
// because it returns a monitorable future
while((item = stack.pollFirst()) != null){
    Runnable worker = new Solider(this, item);
    Future<?> f = exec.submit(worker);
    futures.add(f);
}

// A) Await all runnables to be done (blocking)
for(Future<?> future : futures)
    future.get(); // get will block until the future is done

// B) Check if all runnables are done (non-blocking)
boolean allDone = true;
for(Future<?> future : futures){
    allDone &= future.isDone(); // check if future is done
}


 类似资料:
  • 我有一个服务器端应用程序,客户端可以请求重新加载配置。如果一个客户端请求重新加载配置,这不应该立即完成,而是延迟1分钟。如果另一个客户端也在同一分钟内请求重新加载配置,这个请求应该被忽略。 我的想法是安排一个任务与调度ExecutorService像: 如何检查LoadConfigurationTask是否已计划但尚未执行,以便在重新加载配置之前忽略进一步的请求?

  • 我在Windows Server 2012的任务计划程序中有几个计划任务。我正在通过PowerShell运行这些任务 我正在寻找一种检查任务何时完成的方法。我认为我可以在<code>中检查任务的状态,$tasks 我本以为这段代码会导致< code>Ready,然后是< code>Running,但它最终打印出< code>Ready,< code>Ready。 我还注意到,当任务正在执行时,任务

  • 问题内容: 我正在使用线程和队列模块在Python中编写一个简单的搜寻器。我获取一个页面,检查链接并将它们放入队列中,当某个线程完成页面处理后,它将从队列中获取下一个页面。我对已经访问过的页面使用数组,以过滤添加到队列的链接,但是如果有多个线程并且它们在不同页面上获得相同的链接,则会将重复的链接放入队列。那么,如何确定队列中是否已经有一些url以避免再次放置? 问题答案: 如果您不关心项目的处理顺

  • 我正在用Java编写一个应用程序,它使用ExecutorService来运行多个线程。 我希望将多个任务(一次数千个)作为调用项提交给执行器,完成后,检索它们的结果。我处理这个问题的方式是,每次调用submit()函数时,都会得到一个Future(未来),并将其存储在ArrayList中。稍后,我将列表传递给一个线程,该线程不断对其进行迭代,调用future.get()函数并给出一个超时时间,以查

  • 在Java中,Executor类不像ExecutorService子类那样具有shutdown/shutdownNow()/awaitTermination。因此,如果通过调用executorObject启动任务/线程。execute(runnableTask),如何检查任务是否完成?

  • 问题内容: 我在Linux环境中有一个示例脚本,该脚本基本上针对当前shell运行,向其添加密钥并运行两个git命令: 脚本实际上可以正常工作,但是每次运行脚本时,我都会得到一个新进程,因此我认为这可能会成为性能问题,并且最终可能会导致无用的进程。 输出示例: 此外,还有所有这些,是否有可能找到一个现有进程并将我的密钥添加到其中? 问题答案: 到目前为止,答案似乎并未回答原始问题… 这对我有用: