lvhaosir
一个正在奋起的菜鸟...

导航

 

CyclicBarrier

CyclicBarrier 就像它的解释一样,可以看成是个障碍,所有的线程必须到期后才能一起通过这个障碍。

常用方法

  1. CyclicBarrier(int parties) 初始化时规定一个数目,然后计算调用了 await() 进入等待的线程数。当线程数达到了这个数目时,所有进入等待状态的线程都被唤醒并继续。
  2. CyclicBarrier(int parties, Runnable barrierAction) 初始化时带入一个Runnable的参数,此Runnable任务在CyclicBarrier的数目达到后,所有其他线程被唤醒前执行。
  3. await() 休眠等待。 等待所有人到达。

CyclicBarrier(int parties) 使用

package cn.lvhaosir;

import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

class Write implements Runnable {
	CyclicBarrier cyclicBarrier;
	String name;
	
	public Write(CyclicBarrier cyclicBarrier,String name) {
		this.cyclicBarrier = cyclicBarrier;
		this.name = name;
	}
	
	@Override
	public void run() {
		try {
			System.out.println(name+"学生到达教师...等待考试");
			// 等待班上的学生到到期
			cyclicBarrier.await();
			// 开始考试,每个人做题时间不同
			System.out.println(name+"学生正在做题...");
			Thread.sleep(new Random().nextInt(1000));
			// 这次考试,需等待所有同学都写完才交卷
			System.out.println(name+"学生,题目已经写完...等待其他同学");
			// 等待同学们都做完然后交卷
			cyclicBarrier.await();
			System.out.println(name+"学生交卷...");
		} catch (InterruptedException e1) {
			e1.printStackTrace();
		} catch (BrokenBarrierException e1) {
			e1.printStackTrace();
		}
	};
}
public class Test003 {
	public static void main(String[] args) {
		// 创建全班人数 5 人
		CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
		for (int i = 1; i <= 5; i++) {
			// 创建同学
			new Thread(new Write(cyclicBarrier,"学生"+i)).start();
		}
	}
}
/**
学生2学生到达教师...等待考试
学生4学生到达教师...等待考试
学生1学生到达教师...等待考试
学生5学生到达教师...等待考试
学生3学生到达教师...等待考试
学生3学生正在做题...
学生2学生正在做题...
学生4学生正在做题...
学生1学生正在做题...
学生5学生正在做题...
学生3学生,题目已经写完...等待其他同学
学生5学生,题目已经写完...等待其他同学
学生2学生,题目已经写完...等待其他同学
学生4学生,题目已经写完...等待其他同学
学生1学生,题目已经写完...等待其他同学
学生1学生交卷...
学生3学生交卷...
学生5学生交卷...
学生2学生交卷...
学生4学生交卷...
*/

CyclicBarrier(int parties, Runnable barrierAction)

package cn.lvhaosir;

import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

class Write1 implements Runnable {
	CyclicBarrier cyclicBarrier;
	String name;
	
	public Write1(CyclicBarrier cyclicBarrier,String name) {
		this.cyclicBarrier = cyclicBarrier;
		this.name = name;
	}

	public Write1(String name) {
		super();
		this.name = name;
	}

	@Override
	public void run() {
		try {
			System.out.println(name+"学生到达教师...等待考试");
			// 等待班上的学生到到期
			cyclicBarrier.await();
			// 开始考试,每个人做题时间不同
			System.out.println(name+"学生正在做题...");
			Thread.sleep(new Random().nextInt(1000));
			// 这次考试,需等待所有同学都写完才交卷
			System.out.println(name+"学生,题目已经写完...等待其他同学");
			// 等待同学们都做完然后交卷
			cyclicBarrier.await();
			System.out.println(name+"学生交卷...");
		} catch (InterruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (BrokenBarrierException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	};
}
class Read1 implements Runnable {
	@Override
	public void run() {
		System.out.println("所有人都同步了,检查一下信息...");
	}
}
public class CopyOfTest003 {
	public static void main(String[] args) {
		
		CyclicBarrier cyclicBarrier = new CyclicBarrier(5,new Read1());
		
		for (int i = 1; i <= 5; i++) {
			new Thread(new Write1(cyclicBarrier,"学生"+i)).start();
		}
	}
}
/** 结果:
学生1学生到达教师...等待考试
学生5学生到达教师...等待考试
学生4学生到达教师...等待考试
学生3学生到达教师...等待考试
学生2学生到达教师...等待考试
所有人都同步了,检查一下信息...
学生4学生正在做题...
学生1学生正在做题...
学生5学生正在做题...
学生3学生正在做题...
学生2学生正在做题...
学生3学生,题目已经写完...等待其他同学
学生4学生,题目已经写完...等待其他同学
学生5学生,题目已经写完...等待其他同学
学生2学生,题目已经写完...等待其他同学
学生1学生,题目已经写完...等待其他同学
所有人都同步了,检查一下信息...
学生1学生交卷...
学生3学生交卷...
学生4学生交卷...
学生5学生交卷...
学生2学生交卷...
 */

转载请附上原文链接,有问题请留言,谢谢支持。

posted on 2018-07-23 09:56  lvhaosir6  阅读(64)  评论(0)    收藏  举报