Condition的作用和wait(),notify()方法的作用是大致相同的。但是wait()和notify()方法是个synchronized关键字结合使用的,而Condition是和重入锁结合使用的。重入锁实现了Lock接口。
通过Lock接口的Condition newCondition()方法就可以生成一个与当前重入锁绑定的Condition实例。利用Condition对象,可以让线程在合适的时间等待,或者在某一特定的时刻得到通知,继续执行。
void await() throws InterruptedException;
void awaitUninterruptibly();
long awaitNanos(long nanosTimeout) throws InterruptedException;
boolean await(long time,TimeUnit unit) throws InterruptedException;
boolean awaitUnil(Date deadline) throws InterruptedException;
void signal();
void signalAll();
public class ReenterLockCondition implements Runnable {
public static ReentrantLock lock = new ReentrantLock();
public static Condition condition = lock.newCondition();
@Override
public void run() {
try {
lock.lock();
condition.await(); //要求线程在condition对象上等待,并释放持有的锁
System.out.println("Thread is going on");
} catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
ReenterLockCondition r1 = new ReenterLockCondition();
Thread t1 = new Thread(r1);
t1.start();
Thread.sleep(2000);
//通知线程t1继续执行
lock.lock();
condition.signal(); //从condition对象的等待队列中唤醒一个线程
lock.unlock(); //如果不释放这个锁,尽管有个线程已经被唤醒了,但无法获得锁进而无法执行
}
}