0

我有一个“可运行”线程正在启​​动几个“可调用”线程,我想在所有上述线程完成工作时显示结果。

最好的方法是什么?

我的代码如下

Connector.java(启动可运行线程)

  public class Connector {
                      private static void anyFileConnector() {
                    // Starting searching Thread
                        ExecutorService executor = Executors.newFixedThreadPool(100);
                        executor.submit(traverse, executor);
//HERE I WANT MY ALL SEARCH RESULTS/OUTPUT : CURRENTLY IT IS STARTING OTHER THREADS AND NOT SHOWING ME ANY RESULTS BECAUSE NONE OF THEM WAS FINISHED.(IN CONSOLE, I WAS ABLE TO SEE RESULTS FROM ALL THE THREADS
        setSearchResult(traverse.getResult());

                    executor.shutdown();
            }
    }

Traverse.java (Runnable Thread) 我正在使用 ExecutorCompletionService 来处理它......但它没有产生任何区别。:(

public class Traverse implements Runnable {
    public void run() {

    ExecutorService executor = Executors.newFixedThreadPool(100);
    ExecutorCompletionService<List<ResultBean>> taskCompletionService =
            new ExecutorCompletionService<List<ResultBean>>(executor);
    try (DirectoryStream<Path> stream = Files
            .newDirectoryStream(dir)) {
                Search newSearch = new Search();
                taskCompletionService.submit(newSearch);
     }
    list.addAll(taskCompletionService.take().get());
    }
}

Search.java(可调用线程)

public class Search implements Callable<List<ResultBean>> {
 public List<ResultBean> call() {
        synchronized (Search.class) {
// It will return results
            return this.search();
        }
    }

}
4

3 回答 3

2

去争取CyclicBarrier,你将能够实现这一目标。一旦所有线程完成工作,循环屏障就会执行任务,您可以在此处打印最终结果。

检查这个喜欢的工作:http CyclicBarrier: //javarevisited.blogspot.com/2012/07/cyclicbarrier-example-java-5-concurrency-tutorial.html

于 2013-08-04T13:41:25.057 回答
1

简单 - 所有的 Callables 都会返回 Future 对象,您可以使用这些对象等待并通过以阻塞等待方式调用 Future.get() 来获取结果。所以你的问题只是一个 for 循环等待可调用对象上的每个未来。

之后,只需聚合结果返回给客户端。

于 2013-08-27T06:46:06.963 回答
1

执行器服务的提交方法可以返回一个Future对象列表。您可以为您的案例做的是isDone()在 while 循环中调用这些 Future 对象的方法。

无论何时,任何未来的任务都完成了,这个方法将返回 true。您现在可以对此调用get()方法来获取此任务返回的值。通过这种方式,您可以获取所有未来任务值,而无需等待任何特定任务完成(因为您的第一个未来任务可能具有最长的完成时间)

于 2013-09-03T08:44:08.553 回答