我们如何在java中使用回调方法来加入并行处理的多个线程的结果?
问问题
1242 次
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 回答