两个线程交替打印数字-Condition唤醒与等待

[b]看到一道关于多线程题:如何实现两个线程交替打印数字0-9?[/b]

首先我们会想到要实现交替打印,那么就要其中一个执行的时候,另外一个处于等待状态,当该线程执行完的时候,唤醒另外一个。如此执行就可实现。

我们可以通过wait和notify对线程进行状态控制,并且我们需要两个监视器分别对这两个线程的wait和notify控制。如果用synchronized的wait和notify,实现起来比较麻烦(只有wait在相同的锁和监视器上的线程,才能被唤醒),因为对于同一个锁,我们需要不同的监视器进行控制wait和notify。这种情况下,Condition可以比较好的支持.
[b]Condition[/b]:能够更加精细的控制多线程的等待与唤醒,并且对于同一个锁可以创建多个Condition监视器。

代码如下:

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
/**
* 两个线程交替打印1-10数字
* @author happigfemale
*
*/
public class ThreadTest {
//可重入锁
private ReentrantLock lock = new ReentrantLock();
//Condition信号1
private Condition c1 = lock.newCondition();
//Condition信号2
private Condition c2 = lock.newCondition();
private int count = 0;
public void countMethod(){
Thread t1 = new Thread("T1"){
public void run(){
while(count < 10){
lock.lock();
try {
System.out.println(Thread.currentThread().getName() + ":" +count);
count ++;
c1.await();//c1将线程1从运行状态->阻塞等待

c2.signal();//c2将线程2从阻塞等待->唤醒状态


} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
lock.unlock();
}
}
}
};
Thread t2 = new Thread("T2"){
public void run(){
while(count < 10){
lock.lock();
try {
System.out.println(Thread.currentThread().getName() + ":" +count);
count ++;
c1.signal();//c1将线程1从阻塞等待->唤醒状态
c2.await();//c2将线程2从运行状态->阻塞等待
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
lock.unlock();
}

}
}
};

//线程t1启动
t1.start();
while(count == 0){//保证t1先执行
;
}
//线程t2启动
t2.start();

}
public static void main(String[] args) {
new ThreadTest().countMethod();
}
}


执行结果:
T1:0
T2:1
T1:2
T2:3
T1:4
T2:5
T1:6
T2:7
T1:8
T2:9
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值