使用的ExecutorCompletionService
,Executor
和Callable
:
開始用Callable
調用您int
功能:
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爲完成任務。使用Thread.join
不一定會做,因爲你會得到結果的順序來調用連接,不的順序線程完成。
通過使用該執行的,這也將讓你限制你在給定的時間運行並行作業的數量,以便你不小心線程彈系統。
與Java沒有太多的經驗,但我建議您查看從Java .. 7 ForkJoin東西?我覺得是這樣的。試試這個:http://www.infoq。com/news/2008/03/fork_join – adelbertc