首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工作线程上的CyclicBarrier

工作线程上的CyclicBarrier
EN

Stack Overflow用户
提问于 2014-07-02 16:58:48
回答 1查看 266关注 0票数 1

我有一个函数,它将数组分割成较小的部分。

然后在一个单独的线程中对每个片段进行评估。

结果被填充到一个公共列表中。

代码语言:javascript
复制
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));
    }

我原以为,这种循环会等待障碍被打破。

当所有工作线程都被调用等待时,就会发生这种情况。

然而,情况并非如此。

主线程保持递归--不管工作线程的状态如何。怎么会这样?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-02 20:10:31

如果主线程必须等待所有其他线程完成它们的任务,那么该线程就是必须通过屏障的一方,在继续之前,它还必须调用await

代码语言:javascript
复制
// [...]
    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));
// [...]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24536900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档