当前位置: 首页 > 知识库问答 >
问题:

如何让executor服务等待所有线程完成

连正信
2023-03-14

有时我看到一些线程还没有完成他们的工作,服务杀死那个线程,我怎么能强迫服务等待,直到线程完成他们的工作?

这是我的代码:

        ExecutorService pool = Executors.newFixedThreadPool(10);
        List<Future<List<Book>>> futures = Lists.newArrayList();
        final ObjectMapper mapper1 = new ObjectMapper();
        for (final Author a : authors) {
            futures.add(pool.submit(new Callable<List<Book>>() {
                @Override
                public List<Book> call() throws Exception {
                    String urlStr = "http://localhost/api/book?limit=5000&authorId=" + a.getId();

                    List<JsonBook> Jsbooks = mapper1.readValue(
                            new URL(urlStr), BOOK_LIST_TYPE_REFERENCE);

                    List<Book> books = Lists.newArrayList();
                    for (JsonBook jsonBook : Jsbooks) {
                        books.add(jsonBook.toAvro());
                    }

                    return books;
                }
            }));
        }
        pool.shutdown();
        pool.awaitTermination(3, TimeUnit.MINUTES);

      List<Book> bookList = Lists.newArrayList();
    for (Future<List<Book>> future : futures) {
        if (!future.isDone()) {
           LogUtil.info("future " + future.toString());  <-- future not finished yet 
           throw new RuntimeException("Future to retrieve books: " + future + " did not complete");

}
        bookList.addAll(future.get());
    }

我看到了一些例外。future.is完成())块。我怎么能确保每一个未来是当执行者服务关闭?

共有1个答案

左丘成业
2023-03-14

我喜欢用倒计时锁。

将闩锁设置为您正在迭代的大小,并将该闩锁传递到可调用项中,然后在run/call方法中使用try/finally块来递减倒计时闩锁。

在所有事情都进入executor服务队列后,只需调用闩锁的wait方法,该方法将一直阻塞,直到完成所有操作。届时,您的所有可调用项都将完成,您可以正确地关闭executor服务。

这个链接有一个如何设置的示例。http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html

 类似资料:
  • 我打算在主线程中启动2个线程,主线程应该等到所有2个子线程完成,我就是这样做的。 在上面的代码中,确实让主线程等待子线程,但问题是,在第一个线程完成之前不会创建第二个线程。这不是我想要的。 我想要的是,这两个线程立即在主线程中创建,然后主线程等待它们完成。似乎做不到,是吗? 我想,也许我可以通过一个信号灯来完成这项工作,但还有别的方法吗?

  • 我想在C#中处理子目录和文件的文件系统/文件夹。我正在使用TPL库中的任务。这个想法是递归地执行它并为每个文件夹创建一个任务。主线程应该等待子线程完成,然后打印一些信息。事实上我只是想知道扫描何时完成。我已经开始使用线程池,然后切换到TLP。做了一些简单的例子。经过一些尝试从简单的代码到越来越臃肿的代码我被困在这里: 主线程有时仍然过早地继续,而不是在完成所有其他线程之后继续。(我对C#比较陌生,

  • 我正在使用Spring 4.3.8。发布Java7。我想创建一个线程工厂来帮助管理应用程序中的某些工作人员。我像这样声明我的线程工厂 但是,我在线程上“加入”有困难。也就是说,我想在继续某个任务之前等待所有工作完成,所以我有 我的线程池是这样执行的 然而打印出来的是 所以很明显我没有等待。等待我的线程完成工作的正确方法是什么?

  • 问题内容: 我需要一次执行一些任务4,如下所示: 全部完成后如何获得通知?现在,我想不出什么比设置一些全局任务计数器并在每个任务结束时减少它,然后无限循环监视此计数器为0更好的了。或获取期货的列表,并在无限循环中对所有期货进行isDone监视。什么是不涉及无限循环的更好的解决方案? 问题答案: 基本上在你致电之后:

  • 这可能是在类似的背景下问的,但我在搜索了大约20分钟后找不到答案,所以我会问。 我已经编写了一个Python脚本(比如说:scriptA.py)和一个脚本(比如说scriptB.py) 在scriptB中,我想用不同的参数多次调用scriptA,每次运行大约需要一个小时,(这是一个巨大的脚本,做了很多事情……不用担心),我希望能够同时使用所有不同的参数运行scriptA,但我需要等到所有参数都完成

  • 问题内容: 等待所有任务完成的最简单方法是什么?我的任务主要是计算,所以我只想运行大量的作业-每个内核上一个。现在,我的设置如下所示: 实现可运行。这似乎是正确执行的任务,但代码崩溃上用。这很奇怪,因为我玩了一些玩具示例,而且看起来很奏效。 包含数以万计的元素。我应该使用其他方法吗?我正在寻找尽可能简单的东西 问题答案: 最简单的方法是使用单行代码执行所需的操作。用你的话来说,你需要修改或包装以实