使用ExecutorCompletionService
,Executor
和Callable
.:
Callable
从调用您的int
函数的 a 开始:
public class MyCallable implements Callable<Integer> {
private final int i;
public MyCallable(int i) {
this.i = i;
}
public Integer call() {
return Integer.valueOf(myFunction(i));
}
}
创建一个Executor
:
private final Executor executor = Executors.newFixedThreadPool(10);
10
是一次执行的最大线程数。
然后将其包装ExecutorCompletionService
并提交您的作业:
CompletionService<Integer> compService = new ExecutionCompletionService<Integer>(executor);
// Make sure to track the number of jobs you submit
int jobCount;
for (int i = 0; i < n; i++) {
compService.submit(new MyCallable(i));
jobCount++;
}
// Get the results
int a = 0;
for (int i = 0; i < jobCount; i++) {
a += compService.take().get().intValue();
}
ExecutorCompletionService
允许您在完成任务时将任务从队列中拉出。这与加入线程有点不同。尽管总体结果是相同的,但如果您想在线程完成时更新 UI,您将不知道线程将使用联接完成什么顺序。最后一个for
循环可能是这样的:
for (int i = 0; i < jobCount; i++) {
a += compService.take().get().intValue();
updateUi(a);
}
这将在任务完成时更新 UI。使用 aThread.join
不一定会这样做,因为您将按照调用连接的顺序而不是线程完成的顺序获得结果。
通过使用执行器,这也将允许您限制在给定时间同时运行的作业数量,这样您就不会意外地对系统进行线程轰炸。