您的位置:首页 > 编程语言 > Java开发

java学习笔记.05——CyclicBarrier和CountDownLatch

2015-11-01 14:30 417 查看

一、CyclicBarrier

【概念】

有多个线程,每个线程执行并等待所有线程都完成某项任务,之后所有线程才能继续往后执行

【用法】

在每个要设定的线程中的某处设定一个集合信号,每个被设定的线程执行到自身信号处时会暂停等待,当所有被设定的线程都执行到自身的信号地点时所有线程继续执行各自任务。

[Method]

–await() // 设定信号

/**
* 下面的代码运行后,如果t1打印出hello 1、hello2而t2还未打印
* 出hello 1,t1会等待t2执行打印出hello 1再向下执行。
* 当t1和t2都执行到cb.await()处时,t1和t2
*/

CyclicBarrier cb = new CyclicBarrier(2);

Thread t1 = new Thread(new Runnable() {
@override
public void run()
{
System.out.println("hello 1");
System.out.println("hello 2");
cb.await();
System.out.println("hello 3");
}
});

Thread t2 = new Thread(new Runnable() {
@override
public void run()
{
System.out.println("hello 1");
cb.await();
System.out.println("hello 2");
}
});

t1.start();
t2.start();


二、CountDownLatch

【概念】

一批线程等待另一批线程都执行到某个点后开始执行

【用法】

一部分线程先执行,一部分线程后执行。在每个先执行的线程中都设定一个地点,设定线程执行到该地点时会将计数器的值减1。在每个等待的线程中设定一个地点(通常是开头),当计数器的值为0时,所有等待计数器的线程从设定地点开始执行。 注意,先执行的线程和等待被执行的线程内没有固定顺序。

[Constructor]

CountDownLatch cdl = new CountDownLatch(n);  // n是要先执行的线程数


[Method]

–countdown() // 计数器的值减1

–await() // 等待所有先执行的线程执行完毕

/**
* 当t3,t4执行到await()处时暂停,等待t1,t2执行到countdown()
* t1或t2执行到countdown(),等待另一个也执行到countdown()。
* t1和t2都执行到countdown()处
* t3,t4继续执行
*/

CountDownLatch cdl = new CountDownLatch(2);

Thread t1 = new Thread(new Runnable() {
@override
public void run()
{
System.out.println("hello 1");
System.out.println("hello 2");
cbl.countdown();
System.out.println("hello 3");
}
});

Thread t2 = new Thread(new Runnable() {
@override
public void run()
{
System.out.println("hello 1");
System.out.println("hello 2");
cbl.countdown();
System.out.println("hello 3");
}
});

Thread t3 = new Thread(new Runnable() {
@override
public void run()
{
cb.await();
System.out.println("hello 1");
System.out.println("hello 2");
}
});

Thread t4 = new Thread(new Runnable() {
@override
public void run()
{
System.out.println("hello 1");
cb.await();
System.out.println("hello 2");
System.out.println("hello 3");
}
});

t1.start();
t2.start();
t3.start();
t4.start();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java学习 java 线程