Condition的作用和obj.wait和obj.notify的作用大致相同。只不过wait和notify方法和synchronized关键字合作使用,而Condition是与重入锁相关联的。
通过ReentrantLock.newCondition方法可以生成一个与当前重入锁绑定的Condition实例对象,利用Condition对象,我们可以让线程在合适的时间等待,或者在某一时刻得到通知继续执行。
Condition接口提供的方法如下:
void await() throws InterruptedException;
void awaitUninterruptibly();
long awaitNanos(long nanosTimeout) throws InterruptedException;
boolean await(long time, TimeUnit unit) throws InterruptedException;
boolean awaitUntil(Date deadline) throws InterruptedException;
void signal();
void signalAll();
await()会使当前线程等待,同时释放当前锁。当其他线程调用signal方法或者signalAll方法时,线程会重新获得锁并继续执行。或者当前线程被中断时,也能跳出等待。与obj.wait方法相似。
awaitUninterruptibly()与await()方法相似,当时他不会在等待过程中响应中断。
使用实例:
public class ConditionDemo implements Runnable{
private static ReentrantLock lock=new ReentrantLock();
private static Condition condition=lock.newCondition();
@Override
public void run() {
try {
lock.lock();
condition.await();
System.out.println("Thread is await");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
Thread t1=new Thread(new ConditionDemo());
t1.start();
Thread.sleep(1000);
lock.lock();
condition.signalAll();
lock.unlock();
}
}
网友评论