【问题标题】:Joining multiple thread results using callback method使用回调方法加入多个线程结果
【发布时间】:2013-10-13 03:52:34
【问题描述】:

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

【问题讨论】:

  • 使用Future接口。

标签: java multithreading callback


【解决方案1】:

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

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
      }
   }   
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 其实我解释了fork join框架,但是面试官对回调方法很感兴趣,这让我很困惑如何做到这一点。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多