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

用户名

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

安迪·吉伯特(Andy Guibert)

如果使用,没有一种干净的方法来检查所有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
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何检查所有任务(正常还是突然)都已完成?

来自分类Dev

如何检查线程是否已完成其任务?

来自分类Dev

进行多个提取api调用如何检查所有调用是否都已完成?

来自分类Dev

检查ALE是否已完成运行lint

来自分类Dev

如何检查gif动画是否已完成

来自分类Dev

查询以检查节点中的所有源状态是否已完成?

来自分类Dev

Angular - 检查列表中的所有订阅者是否已完成

来自分类Dev

如何使用swift检查线程是否正在运行或已完成

来自分类Dev

同步对象,以确保所有任务均已完成

来自分类Dev

在关闭程序之前,确认所有任务已完成

来自分类Dev

如果Volley RequestQueue已完成所有任务,则回调?

来自分类Dev

当ExecutorService上的所有任务完成或取消时,为什么awaitTermination无法可靠地返回

来自分类Dev

查明Firebase上的childEventListener是否已完成加载所有数据

来自分类Dev

如何检查在回归条件下运行的所有功能文件的报告?

来自分类Dev

如何检查Ansible任务的结果在所有服务器上是否相同?

来自分类Dev

检查表单上的所有元素是否都已完全加载C#

来自分类Dev

完成所有ExecutorService任务后,程序不会立即终止

来自分类Dev

如何检查在osx和centos上安装的python的所有版本

来自分类Dev

如何检查MediaPlayer是否已完成声音加载?

来自分类Dev

如何检查QImage :: save()是否已完成写入磁盘?

来自分类Dev

如何检查api调用是否已完成

来自分类Dev

Bash:如何检查网站是否已完成加载?

来自分类Dev

检查在Golang的STDIN上是否有需要阅读的内容

来自分类Dev

如何检查在Kubernettes的Pod上运行的容器?

来自分类Dev

Java-如何判断所有子线程已完成

来自分类Dev

检查是否已完成Vagrant设置

来自分类Dev

检查HTML输入是否已完成

来自分类Dev

我应如何确保onCreate(View / Dialog)已完成运行,以便正确初始化所有内容?

来自分类Dev

laravel-在队列完成所有任务后运行任务

Related 相关文章

  1. 1

    如何检查所有任务(正常还是突然)都已完成?

  2. 2

    如何检查线程是否已完成其任务?

  3. 3

    进行多个提取api调用如何检查所有调用是否都已完成?

  4. 4

    检查ALE是否已完成运行lint

  5. 5

    如何检查gif动画是否已完成

  6. 6

    查询以检查节点中的所有源状态是否已完成?

  7. 7

    Angular - 检查列表中的所有订阅者是否已完成

  8. 8

    如何使用swift检查线程是否正在运行或已完成

  9. 9

    同步对象,以确保所有任务均已完成

  10. 10

    在关闭程序之前,确认所有任务已完成

  11. 11

    如果Volley RequestQueue已完成所有任务,则回调?

  12. 12

    当ExecutorService上的所有任务完成或取消时,为什么awaitTermination无法可靠地返回

  13. 13

    查明Firebase上的childEventListener是否已完成加载所有数据

  14. 14

    如何检查在回归条件下运行的所有功能文件的报告?

  15. 15

    如何检查Ansible任务的结果在所有服务器上是否相同?

  16. 16

    检查表单上的所有元素是否都已完全加载C#

  17. 17

    完成所有ExecutorService任务后,程序不会立即终止

  18. 18

    如何检查在osx和centos上安装的python的所有版本

  19. 19

    如何检查MediaPlayer是否已完成声音加载?

  20. 20

    如何检查QImage :: save()是否已完成写入磁盘?

  21. 21

    如何检查api调用是否已完成

  22. 22

    Bash:如何检查网站是否已完成加载?

  23. 23

    检查在Golang的STDIN上是否有需要阅读的内容

  24. 24

    如何检查在Kubernettes的Pod上运行的容器?

  25. 25

    Java-如何判断所有子线程已完成

  26. 26

    检查是否已完成Vagrant设置

  27. 27

    检查HTML输入是否已完成

  28. 28

    我应如何确保onCreate(View / Dialog)已完成运行,以便正确初始化所有内容?

  29. 29

    laravel-在队列完成所有任务后运行任务

热门标签

归档