私は、同時一つに、このリニアループを変換したい:がかなり作る:並行配列を処理
for(Item item : ItemList) {
processItem(item);
}
は、これは本当にこれを行うための最短の方法ですか?
具体的には、匿名クラスを使用する方法が欲しいですが、実際には、これを短く読みやすくする方法はわかります。
UPDATE:ただ、それはこの例では、匿名クラスを使用するために非常に簡単ですので、私は、少し愚かされていたが実現:私の元のコードで
for(final Item item : ItemList) {
exec.execute(new Runnable() {
public void run() {
processItem(item);
}
});
}
、ループだったシンプルfor (i=0; i<=ItemList.length(); i++)
とIどのような意味でも最終的なものにする方法は考えられませんでした。私は "for each"ループを使って状況を良くすると思います。
まだ、ボイラープレートの残りの部分を取り除く方法はありますか?
UPDATE 2:ExecutorCompletionService
を使用すると、processItem
とすると結果が返されます。
ExecutorService exec = Executors.newFixedThreadPool(THREADPOOL_SIZE);
CompletionService<ResultType> ecs = new ExecutorCompletionService<ResultType>(executor);
for(final Item item : ItemList) {
ecs.submit(new Callable<ResultType>() {
public ResultType call() {
return processItem(item);
}
});
}
for(Item item : item) {
// Do whatever with the results
ecs.take().get();
}
これはよく見えます。
注意しなければならないのは、何らかの理由でスレッドが復帰しないと上記のコードがデッドロックする可能性があります。代わりに、poll(long timeout、TimeUnit unit)呼び出しを使用することができます。 – Gandalf