CyclicBarrier的使用
CyclicBarrier的使用
summerpxy 发表于4年前
CyclicBarrier的使用
  • 发表于 4年前
  • 阅读 710
  • 收藏 2
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

   CyclicBarrier称为障栅,这个类有什么作用呢?这个类是用来同步线程用的。以小黑车为例(就是盘踞在地铁口的黑出租),一般小黑车是坐4个人,只有4个人都满了之后小黑车才会走,那么如果你是第一个来的,进车坐下,等第二个人来。第二个人来了,等第三个人,如此直到所有的4个人满了之后小黑车才开车。那么这个类也是一样的。

第一个线程:运行到障栅出,等待第二个线程到达。

第二个线程:运行到障栅出,等待第三个线程到达。

第三个线程:运行到障栅出,等待第四个线程到达。

第四个线程:运行到障栅出,障栅解除,所有线程都开始执行。


下面是一个demo,arr[0]和arr[1]的赋值是两个线程完成的,当两个线程的赋值结束之后才会得到arr[2]的值:

package com.wx.app;

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

public class CyclicBarrierTest {

	static int n = 3;

	static int[] arr = new int[3];

	//2代表了barrier处需要拦截两个线程
	static CyclicBarrier barrier = new CyclicBarrier(2, new Runnable() {

		@Override
		public void run() {

			arr[2]=arr[0]+arr[1];
			
			for(int i=0;i<arr.length;i++)
			{
				System.out.println("arr["+i+"]="+arr[i]);
			}
		}

	});

	public static void main(String[] args) {

		new Thread(new Component(1,arr,barrier)).start();
		new Thread(new Component(0,arr,barrier)).start();
	}

	public static class Component implements Runnable {

		int id;
		
		int[] arr;
		
		CyclicBarrier barrier;

		public Component(int id,int[] arr,CyclicBarrier barrier)
		{
			this.id=id;
			this.arr=arr;
			this.barrier=barrier;
		}

		@Override
		public void run() {

			arr[id]=new Random().nextInt(100);
			
			try {
			     
				System.out.println(id+"开始休息");
				//运行到barrier处,睡着等待。。。。
				barrier.await();
				//barrier打开,运行线程
				System.out.println(id+"醒来了");
			} catch (InterruptedException e) {
				
				e.printStackTrace();
			} catch (BrokenBarrierException e) {
				
				e.printStackTrace();
			}
		}

	}
}

CyclicBarrier的执行顺序:当少于期望数量的线程到达barrier.await()方法时,线程停止。当达到期望的数量的时候,执行CyclicBarrier中的runnable方法,cyclic解除,其他的线程接着开始执行。

标签: CyclicBarrier
共有 人打赏支持
粉丝 57
博文 83
码字总数 36092
×
summerpxy
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: