JDK CyclicBarrier简单解释以及相关实例介绍,CyclicBarrier是一个同步辅助类,允许一组线程相互等待,直到到达一个共同的barrier point。如果一组线程需要不定时地相互等待,这个时候就可以用到CyclicBarrier。CyclicBarrier之所以带“Cyclic”前缀,是因为当所有相互等待的线程释放后,Barrier可以被重复利用。
还是看一段java代码,下边输出什么?
- package com.test.java;
- class MyThread3 implements Runnable{
- String name;
- public MyThread3(){}
- public MyThread3(String name) {
- this.name = name;
- }
- @Override
- public void run() {
- for (int i = 0; i < 7; i++) {
- System.out.println(name+”正在做第”+(i+1)+”个俯卧撑。”);
- }
- }
- }
- public class TestConcurrent3 {
- public static void main(String[] args) {
- Thread kaka = new Thread(new MyThread3(“卡卡”));
- kaka.start();
- Thread beckham = new Thread(new MyThread3(“小贝”));
- beckham.start();
- Thread owen = new Thread(new MyThread3(“欧文”));
- owen.start();
- System.out.println(“guys, good job!”);
- }
- }
但是输出的是各种无序,本来想要输出”guys, good job!”但于在最后一行,却发现输出是整个乱的,像这样…
现在是CyclicBarrier的大展身手的时候了。
改造一下代码…
- package com.test.java;
- import java.util.concurrent.BrokenBarrierException;
- import java.util.concurrent.CyclicBarrier;
- class MyThread3 implements Runnable{
- String name;
- CyclicBarrier cyclic;
- public MyThread3(){}
- public MyThread3(String name) {
- this.name = name;
- }
- public MyThread3(String name, CyclicBarrier cyclic) {
- this.name = name;
- this.cyclic = cyclic;
- }
- @Override
- public void run() {
- for (int i = 0; i < 7; i++) {
- System.out.println(name+”正在做第”+(i+1)+”个俯卧撑。”);
- }
- try {
- cyclic.await();
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (BrokenBarrierException e) {
- e.printStackTrace();
- }
- }
- }
- class MyThread3_barrierAction implements Runnable{
- @Override
- public void run() {
- System.out.println(“guys, good job!”);
- }
- }
- public class TestConcurrent3 {
- public static void main(String[] args) {
- CyclicBarrier cyclic = new CyclicBarrier(4, new MyThread3_barrierAction());
- Thread kaka = new Thread(new MyThread3(“卡卡”, cyclic));
- kaka.start();
- Thread beckham = new Thread(new MyThread3(“小贝”, cyclic));
- beckham.start();
- Thread owen = new Thread(new MyThread3(“欧文”, cyclic));
- owen.start();
- try {
- cyclic.await();
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (BrokenBarrierException e) {
- e.printStackTrace();
- }
- }
- }
但又似乎以上java代码好像少了什么东西 .. …