我正在寻找一个类,我可以在其中重写方法来完成工作,并像迭代器一样返回结果。像这样的东西:
ParallelWorkIterator<Result> itr = new ParallelWorkIterator<Result>(trials,threads) {
public Result work() {
//do work here for a single trial...
return answer;
}
};
while (itr.hasNext()) {
Result result = itr.next();
//process result...
}
这主要用于蒙特卡罗模拟之类的事情,但我不想每次都必须处理设置线程池和管理返回线程。我推出了自己的课程希望实现了这一点,但我对此没有足够的信心,并认为我应该检查类似的东西是否已经存在。
编辑:要明确的是,我希望它在每个工作方法返回后继续在后台运行并排队结果,直到所有试验完成。因此 next 方法可能会等待返回,直到队列中有结果。
看看执行者完成服务。它可以做你想做的一切。
void solve(Executor e, Collection<Callable<Result>> solvers)
throws InterruptedException, ExecutionException {
//This class will hold and execute your tasks
CompletionService<Result> ecs
= new ExecutorCompletionService<Result>(e);
//Submit (start) all the tasks asynchronously
for (Callable<Result> s : solvers)
ecs.submit(s);
//Retrieve completed task results and use them
int n = solvers.size();
for (int i = 0; i < n; ++i) {
Result r = ecs.take().get();
if (r != null)
use(r);
}
}
使用 CompletionService 的好处是它始终返回第一个完成的结果。这可确保您无需等待任务完成,并且可以让未完成的任务在后台运行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)