Groovy で小さなスレッド マネージャーを作成しました。マネージャーは、配列、配列で実行するタスク、およびチャンク サイズを受け取ります。その後、タスクは別のスレッドで実行され、結果が結果配列に追加されます。
これはクラスコードです:
class ParallelManager {
static def _threads = []
static def _threadsFinishedCorrectly = []
static def _results = []
static def runParallelTask( def dataArray, def taskFunc, int chunkSize ){
assert chunkSize > 0
assert taskFunc
if (dataArray.size()==0) return
assert dataArray.size() >= 0
def subArray = partitionArray(dataArray, chunkSize)
assert subArray.size() > 0
subArray.each{ arrChunk->
_threads.add( Thread.start{
def chunkResults = taskFunc(arrChunk)
assert chunkResults != null
_results.add(chunkResults) // EXCEPTION HERE
_threadsFinishedCorrectly.add(true)
})
}
// wait for all threads to finish
_threads.each{ it.join() }
log.info("Waiting for all threads to finish...")
assert _threadsFinishedCorrectly.size() == _threads.size(),'some threads failed.'
assert _results.size() == _threads.size()
log.info("${_threads.size()} finished.")
return _results
}
/**
* Util function
* @param array
* @param size
* @return
*/
static def partitionArray(array, size) {
def partitions = []
int partitionCount = array.size() / size
partitionCount.times { partitionNumber ->
def start = partitionNumber * size
def end = start + size - 1
partitions << array[start..end]
}
if (array.size() % size) partitions << array[partitionCount * size..-1]
return partitions
}
マネージャーは次のように呼び出すことができます。
def parallFunc = { array->
log.info "I'm multiplying $array by 2"
return array.collect{it*2}
}
def results = ParallelManager.runParallelTask( [1,2,3,4,5,6,7,8], parallFunc, 3)
このコードは、上記の行でこの例外をスローすることがあります。
Exception in thread "Thread-3" java.lang.ArrayIndexOutOfBoundsException: 1
[java] at java.util.ArrayList.add(ArrayList.java:352)
[java] at java_util_List$add.call(Unknown Source)
この問題の修正はありますか? このような小さなスレッド マネージャーは、コード内の一般的なタスクを高速化するために多くの人にとって役立つと思います。
乾杯、ムローネ