Condition的介绍与使用

Condition是Lock对应synchronize的wait,notify等线程互相作用时而使用的等待通知机制,Condition有着比synchronize更加灵活的用法,实现的功能也更多,通俗的可以说是synchronize只用一个Condition,而lock可以使用多个Condition来进行互相的通知,比如下面的例子可以看出Condition的简单使用

常用方法

void await()    
boolean await(long time, TimeUnit unit)    
signal()   
signalAll()   

不用多说,直接看代码

 

public class LockConditionTest extends Thread{

    Lock lock;
    Condition myCondition;
    String name;

    public LockConditionTest(Lock l,Condition c,String name){
        lock=l;
        this.name=name;
        myCondition=c;
    }
    public void SignalOther(){
        lock.lock();
        //唤醒一个阻塞等待的线程,同一个Condition的才行
        myCondition.signal();
        lock.unlock();
    }

    @Override
    public void run() {
        lock.lock();//上锁
        try {
            System.out.println(System.currentTimeMillis()+this.name+"我睡了");
            myCondition.await();//等待
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(System.currentTimeMillis()+this.name+"醒了");
        lock.unlock();
    }
}
public class testMain {
    public static void main(String[] args) throws InterruptedException {
        Lock lock=new ReentrantLock();
        Condition con=lock.newCondition();
        //给他们一样的Condition
        LockConditionTest lct1=new LockConditionTest(lock,con,"一号");
        LockConditionTest lct2=new LockConditionTest(lock,con,"二号");
        lct1.start();//一号进行等待
        sleep(1000);
        lct2.SignalOther();//二号进行唤醒,如果不唤醒一号将一直阻塞
    }
}

运行结果

可以看到同一个Condition是可以互相通知的,如果是不同的则不行

修改一下主函数,现在给他们不同的Condition

public static void main(String[] args) throws InterruptedException {
        Lock lock=new ReentrantLock();
        Condition con=lock.newCondition();
        Condition con2=lock.newCondition();//另一个Condition
        LockConditionTest lct1=new LockConditionTest(lock,con,"一号");
        LockConditionTest lct2=new LockConditionTest(lock,con2,"二号");//二号condition
        lct1.start();
        sleep(1000);
        lct2.SignalOther();
        //循环5秒看看是否能唤醒
        for (int i=0;i<5;i++){
            System.out.println("唤醒没?");
            sleep(1000);
        }
        lct1.SignalOther();//自己来唤醒自己吧
    }

从结果可以看出,不同的Condition是不能互相作用的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值