我有一个大小为N的数组。我想要将它的元素在2个或更多线程中进行洗牌。每个线程应该使用自己的数组部分进行操作。
比如说,第一个线程对从0到K的元素进行洗牌,第二个线程对从K到N的元素进行洗牌(其中0 < K < N)。所以,它可以看起来像这样:
//try-catch stuff is ommited
static void shuffle(int[] array) {
Thread t1 = new ShufflingThread(array, 0, array.length / 2);
Thread t2 = new ShufflingThread(array, array.length / 2, array.length);
t1.start();
t2.start();
t1.join();
t2.join();
}
public static void main(String[] args) {
int array = generateBigSortedArray();
shuffle(array);
}
JVM能保证在这样的洗牌后,我能从主方法中看到数组array
的变化吗?
为了得到这样的保证,我应该如何实现ShufflingThread
(或者说,我应该如何运行它,也许是在synchronized
块内或其他地方)?
join()
返回后就会结束,所以最终你必须在没有声称它为volatile
的情况下在array
中获取一致的数据。但是在共享数组的情况下,我不是完全确定。也许复制数组的其中一半并将其传递给其中一个线程是个好主意。 - 9000