Java8基础之CyclicBarrier类的使用

1.查看api

在这里插入图片描述
该类用于规定指定执行完毕的线程数量,当指定的线程数量完成的时候就会执行最后的线程

2.查看方法

在这里插入图片描述
当前方法就一个await方法估计和前面的CountDownLatch类的使用方法一致

3.例子

计算3+6+9的和

/**
 * @description 用于测试CyclicBarrier类
 * @author hy
 * @date 2019-10-12
 */
public class CyclicBarrierTest {
	/**
	 * CyclicBarrier这个类用于规定指定的线程都必须完成执行,当达到指定的次数的时候就会执行最后的线程
	 */
	// 创建一个CyclicBarrier类指定其中的三个线程必须完成任务,完成任务后执行FinishThread线程中的任务
	CyclicBarrier cb = new CyclicBarrier(3, new FinishThread());
	
	public static void main(String[] args) {
		CyclicBarrierTest barrierTest=new CyclicBarrierTest();
		barrierTest.testCyclicBarrier();
	}
	//测试和启动线程
	public void testCyclicBarrier() {
		new Thread(new AThread()).start(); 
		new Thread(new BThread()).start(); 
		new Thread(new CThread()).start(); 		
		
	}
	public void await() {
		try {
			cb.await();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (BrokenBarrierException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//默认所有线程都休眠200ms
	public void sleep() {
		try {
			Thread.sleep(200);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private int a=0;
	private int b=3;
	private int c=6;

	//执行a++操作
	class AThread implements Runnable {

		@Override
		public void run() {
			String name = Thread.currentThread().getName();
			for (int i = 0; i < 3; i++) {
				a++;
				System.out.println(name + ":线程正在执行a++操作,a=" + a);
				sleep();//模拟线程延迟
			}
			await();//这里必须要执行await
		}

	}

	//执行b++操作
	class BThread implements Runnable {

		@Override
		public void run() {
			String name = Thread.currentThread().getName();
			for (int i = 3; i < 6; i++) {
				b++;
				System.out.println(name + ":线程正在执行b++操作,b=" + b);
				sleep();//模拟线程延迟
			}
			await();//这里必须要执行await
		}

	}
	//执行c++操作
	class CThread implements Runnable {

		@Override
		public void run() {
			String name = Thread.currentThread().getName();
			for (int i = 6; i < 9; i++) {
				c++;
				System.out.println(name + ":线程正在执行c++操作,c=" + c);
				sleep();//模拟线程延迟
			}
			await();//这里必须要执行await
		}

	}
	
	//执行a+b+c操作
	class FinishThread implements Runnable {

		@Override
		public void run() {
			int result=a+b+c;
			System.out.println("a+b+c的结果为:"+result);

		}
	}
}


结果:

在这里插入图片描述
可以通过任务调度的方式完成其中的任务,然后等任务完成后执行结果的线程

4.总结

1.CyclicBarrier类可以用于执行任务等待执行的线程全部完毕后再执行最终的线程

2.CyclicBarrier需要再构造函数中指定完成的任务的线程数量完成任务后执行的线程

3.需要通过awiat方法开启同步

以上纯属个人见解,如有问题请联系本人!

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页