如何在Java中使用多个线程迭代一个Collection,其中没有两个线程迭代在Collection的同一部分?

ful*_*ead 3 java iteration collections multithreading

我需要迭代一个大的ArrayList(约50,000个条目),我需要使用多个线程来相当快地完成这个.

但是我需要每个线程从一个唯一索引开始,这样就不会有两个线程迭代在列表的同一部分上.将会有一个batchSize100这样每个线程将循环从startIndexstartIndex + 100.

有没有办法实现这个目标?请注意,我只在这里执行读取操作,没有写入.列表中的每个条目只是一个String,它实际上是一个SQL查询,然后我通过JDBC对DB执行.

dim*_*414 5

如果你只打算阅读它List,而不是改变它,你可以简单地定义你RunnableLista和a startIndex作为构造函数参数.ArrayList只要没有线程同时修改它,就没有同时读取(甚至相同的索引)的危险.

为了安全起见,请务必将您ArrayList的呼叫Collections.unmodifiableList(),并通过 List给你Runnable秒.这样你就可以确信线程不会修改支持ArrayList.

或者,您可以在主线程(with List.subList())中构建子列表,这样您就不需要将其传递startIndex给每个线程.但是,在执行此操作之前,您仍希望使子列表不可修改.六分之一,另外六分之一.

更妙的是使用番石榴ImmutableList; 它天生就是线程安全的.

Java 8中也有并行流,但要注意这个解决方案; 他们很强大,但很容易出错.