工人线程上的CyclicBarrier

时间:2014-07-02 16:58:49

标签: java multithreading java.util.concurrent cyclicbarrier

我有一个将数组拆分成小块的功能 然后在单独的线程中评估每个部分 结果填充到一个共同的列表中。

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));
    }

我原本希望sortandkeep递归等待屏障被打破 当所有工作线程都已调用等待时,就会发生这种情况 但事实并非如此 主线程保持递归 - 无论工作线程的状态如何。 这是怎么回事?

1 个答案:

答案 0 :(得分:1)

如果主线程必须等待所有其他线程完成其任务,那么该线程是必须通过屏障的一方,并且它必须在继续之前调用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));
// [...]