详情见《Java语言程序设计-进阶篇》P238
使用场景:
使用condition可以实现线程协作。取款线程发现账户余额不足,先停止自己的线程,等待存款线程存入钱后再叫醒该取款线程重新取钱。
编码流程:
从ReentrantLock对象获得Condition对象
Lock lock=new ReentrantLock();
Condition condition=lock.newCondition();
一个取款线程A发现账户余额不足,
while(balance<amount)
{
System.out.println("await()");
condition.await();
}
System.out.println("回来了threadA()");
···
···
finally{
lock.unlock();
}
线程A会在第四行停下来,进入休眠状态,不会去执行后面的finally内容!!
而这时一个存款线程B可以获取到这个锁然后进行存款操作,存款操作结束后,再调用signalAll():
condition.signalAll();
System.out.println("先执行完所有threadB内容");
···
···
finally{
lock.unlock();
}
调用signalAll()之后,线程B会将下面的全部代码执行完之后进入finally自己手动解锁,然后线程A才能拿到锁,并且在原来停下来的第四行继续往后执行,直至线程任务结束进入finally,解除lock。
一个需要注意的问题 :
普通一个线程(包括使用线程池!)中的任务执行完毕之后会自动结束!
Thread thread=new Thread(new Runnable()·····
···
···
···);
thread.start();