你是否正在寻找关于cyclicbarrier的内容?让我把最有价值的东西奉献给你:
CountDownLatch和cyclicbarrier都能程执行时设置中间等待位置,表面上看相度很高,下面讲讲他们的区别:
CountDownLatch是线程A等待B。它有着明确的顺序,A先执行,到中间等待位置后,A调用countDown()方法,激活B,B才开始执行。再强调一下,这个类强调顺序,A先,B后
CyclicBarrier是线程间互相等待,即A和B互相等待,可能是A等待B,也可能是B等待A。举个例子,当年纣王对苏妲己吟过一首诗:爱妃听我真心言,你我想约共百年,谁若九十七岁死,奈何桥上等三年。这种情况就必须使用cyclicbarrier来实现,。中间等待位置是奈何桥上,纣王和苏妲己是2个线程,他们活在人世时是线程的前半部分,相约100岁时在奈何桥见面,然后牵手走完线程的后半部分。但人有旦夕祸福,两人都能活到100岁吗?不一定,可能纣王命短,97岁就死了,于是他到奈何桥头等待妲己。反之也有可能妲己命短,她97岁死了,去奈何桥等纣王3年。这就是所谓的相互等待,谁等谁都是有可能的。并且,两人在奈何桥会和后,线程并未结束,二人还会手牵手继续前行,走完线程的后半部分。
cyclicbarrier还有一个重要特点,他是可重用的,当计数器减少到0开闸后,计数器会自动地恢复为初始,以便下一次使用。
cyclicbarrier应用举例:多线程实现希尔排序。以长度为10的数组{3,6,7,1,2,9,5,12,10,16}为例,开3个线程处理。
当步长为5时,原数组被分为5个子数组,分别是:
3, 9 6, 5 7, 12 1, 10 2, 16 用3个线程对着5个子数组进行插入排序,第一个线程负责{3,9}和{1,10}两个子数组;第二个线程负责{6,5}和{2,16}两个子数组;第三个线程负责{7,12}这一个子数组。三个线程分开运行,互不干扰,无需加锁同步。使用cyclicbarrier让他们都在排序结束后相互等待。当3个线程全部排序完毕,修改步长为2,然后3个开工继续对子数组进行插入排序。这时有个问题,线程有3个,子数组只有2个,因此,第三个线程将什么都不做,直接执行await()语句进入等待状态。以此类推,直到步长为1排序结束后。整个数组排序结束,3个线程也自然结束。以下是源码,定义了一个MultiThreadAlgorithm类,有一个静态方法shellSort(),在该方法中创建多个线程,进行希尔排序。最后定义了线程对象,负责具体的排序操作。此代码使用了Java 7的语法
//多线程算法对象,内部定义了一些静态方法,均用多线程实现 public class MultiThreadAlgorithm { public static void shellSort(int[] a, int threadCount) { List
以上就是关于cyclicbarrier的全部内容,相信你一定会非常满意。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-1422-1.html
我要是伊拉克总统
好吧我也来加油了