2009-05-27 13 views
3

私は、同時一つに、このリニアループを変換したい:がかなり作る:並行配列を処理

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 2ExecutorCompletionServiceを使用すると、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(); 
} 

これはよく見えます。

+0

注意しなければならないのは、何らかの理由でスレッドが復帰しないと上記のコードがデッドロックする可能性があります。代わりに、poll(long timeout、TimeUnit unit)呼び出しを使用することができます。 – Gandalf

答えて

7

ExecutorCompletionServiceをJDK 6でチェックしてください。これにより、割り当てられたタスクに複数のスレッドを実行し、処理された各スレッドの結果を取得することができます。

+3

ExecutorCompletionServiceもJDK5にあります。 – Thilo

1

あなたは結果が必要ですし、次に提出多分ような何かと同じ順序でそれらをしたい場合:

List<Future<ResultType>> futures = new ArrayList<Future<ResultType>>(); 
for(final Item item : items) { 
    futures.add(executor.submit(...)) 
} 
List<ResultType> results = new ArrayList<ResultType>(); 
for(Future<ResultType> future : futures) { 
    results.add(future.get()); 
} 
return results; 

EDITを:あなたは、いくつかのオーバーエンジニアリングまでなら、あなたはイテレータを返すことができますGoogleのコレクションライブラリから「イテレータ」を使用して

return Iterators.transform(results, new Function<Future<ResultType>,ResultType>() { 
    public ResultType apply(Future<ResultType> future) { 
     return future.get(); 
    } 
}) 

:代わりに、第二のループを(すべてが利用可能になる前に、発信者は、結果の処理を開始できるように)やって。もう一つの可能​​性は、先物のリストを返して、呼び出し側に待ってもらうことです。

関連する問題