想必大家都知道,Objet类有wait() ,notify()方法;分别是让线程等待和唤醒,那么condition效果是大同小异的,只不过需要和ReentrantLock搭配使用(而wait和notify是和synchronzied搭配使用的)。由此可见,利用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时,线程会重新获得锁并继续执行,当线程被中断时有嗯哪根跳出等待。
awaitUninterruptibly方法与await方法基本相同,但是不会在等待过程中响应中断。
示例代码:
package cn.yan.current;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class TestReenterLockCondition implements Runnable {
public static ReentrantLock lock = new ReentrantLock();
public static Condition condition = lock.newCondition();
@Override
public void run() {
try {
lock.lock();
condition.await();
System.out.println("线程继续执行。。。");
} catch (InterruptedException ex) {
ex.printStackTrace();
} finally {
lock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
TestReenterLockCondition lockCondition = new TestReenterLockCondition();
Thread thread1 = new Thread(lockCondition);
thread1.start();
System.out.println("线程开始。。。");
Thread.sleep(2000);
lock.lock();
condition.signal();
lock.unlock();
}
}
其执行结果为:
线程开始。。。
线程继续执行。。。