我有一个函数,它将数组分割成较小的部分。
然后在一个单独的线程中对每个片段进行评估。
结果被填充到一个公共列表中。
private void sortandkeep(int[] arr){
traversed.add(arr);
if(arr.length==1) return;
List<Integer> layer=new ArrayList<Integer>();
//Divide the layer into different parts for a barrier to be set up.
//After the barrier is broken,the layer is added to the main list
if(arr.length>4){
List<int[]> parts=split(arr);//smaller split pieces are populated on the list
CyclicBarrier barrier = new CyclicBarrier(parts.size());
for(int[] e:parts){
Thread t=new Thread(new sortingThread(barrier,e,layer));
t.start();
}
}
else
.........
//The main thread should not proceed,unless the above barrier is broken
sortandkeep(toIntArray(layer));
}我原以为,这种循环会等待障碍被打破。
当所有工作线程都被调用等待时,就会发生这种情况。
然而,情况并非如此。
主线程保持递归--不管工作线程的状态如何。怎么会这样?
发布于 2014-07-02 20:10:31
如果主线程必须等待所有其他线程完成它们的任务,那么该线程就是必须通过屏障的一方,在继续之前,它还必须调用await。
// [...]
CyclicBarrier barrier = new CyclicBarrier(parts.size() + 1); // sorting threads AND main thread
for(int[] e:parts){
Thread t=new Thread(new sortingThread(barrier,e,layer));
t.start();
}
} else
// [...]
//The main thread should not proceed, unless the above barrier is broken
barrier.await();
sortandkeep(toIntArray(layer));
// [...]https://stackoverflow.com/questions/24536900
复制相似问题