admin管理员组文章数量:1599541
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是不能互相作用的
本文标签: condition
版权声明:本文标题:Condition的介绍与使用 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1728322942a1154063.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论