CyclicBarrier和CountDownLatch的区别

1. 字面意思
CyclicBarrier : 循环的屏障
CountDownLatch : 向下计数锁

2. 用途
CyclicBarrier : 让指定的线程等待,直到所有线程达到同一执行点全部继续执行
CountDownLatch : 让线程等待,直到CountDownLatch计数到0,继续执行该线程。

3. 主要方法:
CyclicBarrier :
await() : 一直等待,直到所有线程都执行到await代码处,所有线程同时继续执行。
CountDownLatch:
countDown : 计数-1
await() : 线程等待,直到计数到0才继续执行

4. 实例:
CyclicBarrier:
public class CyclicBarrierTest {

	public static void main(String[] args) {
		CyclicBarrier cyclicBarrier = new CyclicBarrier(10);
		for(int i = 0; i < 10;i++) {
			Thread t = new Thread(new ThreadTest2(cyclicBarrier, i * 1000L));
			t.start();
		}
	}
}

class ThreadTest2 implements Runnable {
	
	CyclicBarrier cyclicBarrier;
	
	long s = 0;
	
	public ThreadTest2(CyclicBarrier cyclicBarrier, long s) {
		this.cyclicBarrier = cyclicBarrier;
		this.s = s;
	}

	@Override
	public void run() {
		System.out.println("start current thread name : " + Thread.currentThread().getName());
		try {
			Thread.sleep(s);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("current thread name : " + Thread.currentThread().getName() + "end sleep");
		try {
			cyclicBarrier.await();
		} catch (InterruptedException e1) {
			e1.printStackTrace();
		} catch (BrokenBarrierException e1) {
			e1.printStackTrace();
		}
		System.out.println("end current thread name : " + Thread.currentThread().getName());
	}
}


结果:
start current thread name : Thread-3
start current thread name : Thread-2
start current thread name : Thread-0
start current thread name : Thread-1
start current thread name : Thread-5
start current thread name : Thread-4
start current thread name : Thread-6
start current thread name : Thread-7
start current thread name : Thread-8
current thread name : Thread-0end sleep
start current thread name : Thread-9
current thread name : Thread-1end sleep
current thread name : Thread-2end sleep
current thread name : Thread-3end sleep
current thread name : Thread-4end sleep
current thread name : Thread-5end sleep
current thread name : Thread-6end sleep
current thread name : Thread-7end sleep
current thread name : Thread-8end sleep
current thread name : Thread-9end sleep
end current thread name : Thread-9
end current thread name : Thread-8
end current thread name : Thread-7
end current thread name : Thread-6
end current thread name : Thread-5
end current thread name : Thread-0
end current thread name : Thread-4
end current thread name : Thread-3
end current thread name : Thread-2
end current thread name : Thread-1

分析:
main线程中启动10个子线程,并传入CyclicBarrier对象,子线程立即打印start current name,
随后执行睡眠(sleep),结束睡眠后打印end sleep ,虽然不同的子线程睡眠时间不一样,但由于调用 了
cyclicBarrier.await()方法,所有子线程都等待其它线程都执行到该代码处才继续执行打印end current name

CountDownLatch:
public class CountDownLatchTest {

	public static void main(String[] args) throws InterruptedException {
		System.out.println("main thread start");
		CountDownLatch latch = new CountDownLatch(10);
		for(int i = 0; i < 10; i++) {
			ThreadTest t = new ThreadTest(latch);
			Thread thread = new Thread(t);
			thread.start();
		}
		latch.await();
		System.out.println("main thread end");
	}
	
}

class ThreadTest implements Runnable {
	
	CountDownLatch latch;
	
	public ThreadTest(CountDownLatch latch) {
		this.latch = latch;
	}

	@Override
	public void run() {
		System.out.println("start current thread name : " + Thread.currentThread().getName());
		latch.countDown();
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("end current thread name : " + Thread.currentThread().getName());
	}
}


结果:
main thread start
start current thread name : Thread-3
start current thread name : Thread-1
start current thread name : Thread-0
start current thread name : Thread-2
start current thread name : Thread-4
start current thread name : Thread-5
start current thread name : Thread-6
start current thread name : Thread-7
start current thread name : Thread-8
start current thread name : Thread-9
main thread end

分析:
main线程打印main thread start,随后启动10个子线程,启动完线程后由于调用了latch.await()方法,所以并没有立既继续执行main thread end,而是等待子线程调用latch.countDown()方法使计数到0后才继续执行main thread end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值