GPars文档说我们不应该这样做:
def thumbnails = []
images.eachParallel {thumbnails << it.thumbnail} // Concurrently accessing a not-thread-safe collection of thumbnails? Don't do this!
来源:http://www.gpars.org/webapp/guide/index.html#_avoid_side_effects_in_functions
我想编写一种类似的代码,其中并行执行方法需要写入公共List。我怎么能这样做?
答案 0 :(得分:2)
您显示的代码不是线程安全的 - 多个不同的线程会尝试并行添加元素到列表中。可能发生的情况是两个(或更多)线程尝试在同一索引处添加元素,因此最后一个线程实际上将替换前一个线程所执行的操作。
请尝试以下操作:
def thumbnails = images.collectParallel {it.thumbnail}
或
def thumbnails = images.parallel.map {it.thumbnail}
它具有线程安全性,因此您可以获得所有缩略图的列表。