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是不能互相作用的