Condition的作用和obj.wait和obj.notify的作用大致相同。只不過wait和notify方法和synchronized關(guān)鍵字合作使用,而Condition是與重入鎖相關(guān)聯(lián)的。
通過ReentrantLock.newCondition方法可以生成一個與當(dāng)前重入鎖綁定的Condition實(shí)例對象,利用Condition對象,我們可以讓線程在合適的時間等待,或者在某一時刻得到通知繼續(xù)執(zhí)行。
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()會使當(dāng)前線程等待,同時釋放當(dāng)前鎖。當(dāng)其他線程調(diào)用signal方法或者signalAll方法時,線程會重新獲得鎖并繼續(xù)執(zhí)行?;蛘弋?dāng)前線程被中斷時,也能跳出等待。與obj.wait方法相似。
awaitUninterruptibly()與await()方法相似,當(dāng)時他不會在等待過程中響應(yīng)中斷。
使用實(shí)例:
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();
}
}