【发布时间】:2013-10-13 03:52:34
【问题描述】:
我们如何在java中使用回调方法来连接多个并行处理的线程的结果?
【问题讨论】:
-
使用
Future接口。
标签: java multithreading callback
我们如何在java中使用回调方法来连接多个并行处理的线程的结果?
【问题讨论】:
Future接口。
标签: java multithreading callback
您可以使用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
}
}
}
【讨论】:
它不使用回调,但 Java 的 fork/join 框架将是一个很好的开始方式,它正好用于同步并行执行的任务。
但是,如果您想构建一些“基于回调”的东西,您可以将一个接口传递给线程,该接口在它们完成后将执行同步并确保代码是线程安全的。
【讨论】:
您可以调用synchronized 方法在每个单独的线程中“加入”结果,并且您可以使用屏障或倒计时来同步这些线程。
【讨论】:
使用fork/join,主线程等到所有线程/fork完成,然后处理所有结果;使用回调,一旦结果准备好,每个线程都会调用主线程中的方法来发布其结果。因此,当线程的执行时间不相等时,回调可能会稍微快一些。
【讨论】: