【问题标题】:CyclicBarrier on worker threads工作线程上的 CyclicBarrier
【发布时间】:2014-08-23 14:03:18
【问题描述】:

我有一个函数可以将数组拆分成更小的部分。
然后在单独的线程中评估每个部分。
结果被填充到一个通用列表中。

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 递归等待障碍被打破。
当所有工作线程都调用 await 时,就会发生这种情况。
然而,事实并非如此。
主线程不断递归 - 无论工作线程的状态如何。 这是怎么回事?

【问题讨论】:

  • 看来您需要的是 CountdownLatch 而不是 CyclicBarrier。我认为线程不需要相互等待。
  • 您说您希望 sortandkeep 等待障碍,但您的示例没有显示对 barrier.await() 的任何调用。
  • 无论如何,@edharned 可能对您的问题有所了解。 CyclicBarrier 的目的是确保一组线程同时开始一些新的活动。如果您希望一个线程等到所有其他线程都完成某事,那么您可以按照 edharned 的建议进行操作并使用 CountdownLatch(工作人员调用latch.countDown(),主调用latch.await() )。或者,您可以让每个工作线程都加入主线程(),但这需要更多的代码行,因为您需要将所有工作线程的引用保存在容器中。

标签: java multithreading java.util.concurrent cyclicbarrier


【解决方案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));
// [...]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 2014-07-30
    相关资源
    最近更新 更多