1

我们如何在java中使用回调方法来加入并行处理的多个线程的结果?

4

4 回答 4

1

您可以使用CompletionService。它在队列中接收未来结果,因为它们可从执行程序线程中获得。从技术上讲,它不是一个回调,而是一个回调。例如:

public class Main {

    public static void main(String... args) {
        CompletionService<SomeResult> completionService = 
           new ExecutorCompletionService<SomeResult>(executor);

        ResultProcessor processor = new ResultProcessor(completionService);
        processor.start();

        completionService.submit(new Callable<SomeResult>() {
           public SomeResult call() {
               ...
               return result;
           }
        });
    }
}

class SomeResult {}

class ResultProcessor extends Thread {
   private CompletionService<SomeResult> completionService;

   ResultProcessor(CompletionService completionService) {
       this.completionService = completionService;
   }

   public void run() {
      while(...) {
          Future<SomeResult> resultFuture = completionService.take(); //blocks if none available
          SomeResult result = resultFuture.get();
          ... // result processing
      }
   }   
}
于 2013-10-13T06:46:34.263 回答
0

它不使用回调,但 Java 的fork/join框架将是一个很好的开始方式,它正好用于同步并行执行的任务。

但是如果你想构建一些“基于回调”的东西,你可以将一个接口传递给线程,一旦它们完成就会执行,这将执行同步并确保代码是线程安全的。

于 2013-10-13T03:57:25.547 回答
0

使用fork/join,主线程等到所有线程/fork完成,然后处理所有结果;通过回调,每个线程在结果准备好后调用主线程中的方法来发布其结果。因此,当线程的执行时间不相等时,回调可能会稍微快一些。

于 2013-10-13T04:39:28.897 回答
0

您可以调用一个synchronized方法来“加入”每个单独的线程中的结果,并且您可以使用屏障或倒计时锁来同步这些线程。

于 2013-10-13T04:26:54.187 回答