2012-03-01 9 views
0

を立ち上げ、各スレッドのインデックスを必要とする、私は並行していくつかの作業を行うために3つのスレッドを起動...GroovyのGPars、Groovyの持つGParsを使用して

GParsPool.withPool(3){ 
    result = myList.collectParallel{ 
     processItem(it) 
    } 
} 

これは正常に動作しますが、私はその閉鎖にインデックスを必要とします起動されたスレッド番号を表します。ループがないので、そのようなインデックスにアクセスする方法は不明です。すべてが並行して起こっています。

グルービーに)eachWithIndexに(

GParsPool.withPool(3) { 
    result = myList.eachWithIndexParallel{ i -> 
     processItem(it, i) 
    } 
} 

答えて

2

Iは、eachWithIndexParallelを使用してこれを試みたが、Groovyは(ArrayListの整数)のためのそのような方法を訴える閉鎖への2つの引数を通過しない結果を返していない: GParsPoolを。メソッドを見つけることができない理由について説明している、withLook(3){ myList.eachWithIndexParallel {e、i - > processItem(e、i) } }

ただし、スレッドセーフな方法で結果を得るには、特別な注意が必要です。

要素を処理するスレッドの識別を取得する1つの方法は、クロージャ内のThread.currentThread()メソッドを照会することです。

+0

@Vaclac最後の夜に遊んでいて、あなたが正しいとすれば、 'eachWithIndexParallel'は結果を収集しないので、明示的な並行処理を避けるために' collectParallel'を使っています...質問: 'eachWithIndexParallel'には2つの引数が必要ですか?その情報はどこにありますか? – raffian

+0

Groovyでそのようなもの(メソッドに渡されるクロージャの予想される数またはタイプの引数)を記述することは一般的には難しいです。この特定のケースでは、eachWithIndexParallel()はGroovyのオリジナルのsequentialWithIndex()メソッドのコントラクトにちょうど従います。 –

+0

ドキュメント:http://gpars.org/1.2.1/groovydoc/groovyx/gpars/Parallel.html#eachWithIndexParallel%28groovy.lang.Closure%29 – pyb

関連する問題