ful*_*ead 3 java iteration collections multithreading
我需要迭代一个大的ArrayList(约50,000个条目),我需要使用多个线程来相当快地完成这个.
但是我需要每个线程从一个唯一索引开始,这样就不会有两个线程迭代在列表的同一部分上.将会有一个batchSize的100这样每个线程将循环从startIndex到startIndex + 100.
有没有办法实现这个目标?请注意,我只在这里执行读取操作,没有写入.列表中的每个条目只是一个String,它实际上是一个SQL查询,然后我通过JDBC对DB执行.
如果你只打算阅读它List,而不是改变它,你可以简单地定义你Runnable的Lista和a startIndex作为构造函数参数.ArrayList只要没有线程同时修改它,就没有同时读取(甚至相同的索引)的危险.
为了安全起见,请务必将您ArrayList的呼叫Collections.unmodifiableList(),并通过该 List给你Runnable秒.这样你就可以确信线程不会修改支持ArrayList.
或者,您可以在主线程(with List.subList())中构建子列表,这样您就不需要将其传递startIndex给每个线程.但是,在执行此操作之前,您仍希望使子列表不可修改.六分之一,另外六分之一.
更妙的是使用番石榴的ImmutableList; 它天生就是线程安全的.
Java 8中也有并行流,但要注意这个解决方案; 他们很强大,但很容易出错.
| 归档时间: |
|
| 查看次数: |
4016 次 |
| 最近记录: |