我有以下功能,在伪代码:递归并发
Result calc(Data data) {
if (data.isFinal()) {
return new Result(data); // This is the actual lengthy calculation
} else {
List<Result> results = new ArrayList<Result>();
for (int i=0; i<data.numOfSubTasks(); ++i) {
results.add(calc(data.subTask(i));
}
return new Result(results); // merge all results in to a single result
}
}
我想并行化,使用线程固定数目的。
我第一次尝试是:
ExecutorService executorService = Executors.newFixedThreadPool(numOfThreads);
Result calc(Data data) {
if (data.isFinal()) {
return new Result(data); // This is the actual lengthy calculation
} else {
List<Result> results = new ArrayList<Result>();
List<Callable<Void>> callables = new ArrayList<Callable<Void>>();
for (int i=0; i<data.numOfSubTasks(); ++i) {
callables.add(new Callable<Void>() {
public Void call() {
results.add(calc(data.subTask(i));
}
});
}
executorService.invokeAll(callables); // wait for all sub-tasks to complete
return new Result(results); // merge all results in to a single result
}
}
不过,这很快就陷入了一种僵局,因为,而前递归级别等待所有线程完成,内部级别也等待线程变得可用...
如何在没有死锁的情况下高效并行我的程序?
什么问题? – 2013-02-26 08:15:59
我们在代码中看不到任何同步,所以我们无法帮助您找到死锁。提供的代码与死锁无关。 – ATrubka 2013-02-26 08:17:58
它可能只是,那numOfThreads小于callables.size()?你应该确保在你的实现中,你有更多的线程比可调参数(在树上).. – cybye 2013-02-26 08:19:30