使用 Condition是个接口,基本的方法就是await()和signal()方法; Condition依赖于Lock接口,生成一个Condition的基本代码是lock.newCondition() 调用Condition的await()和signal()方法,都必须在lock保护之内,就是说必须在lock.lock()和lock.unlock之间才可以使用 void await() throws InterruptedException; 调用前需要先获取锁,使当前线程等待,同时释放当前锁,当其他线程调用signal()方法或者signalAll()方法时,线程会重新获取锁并继续执行。 或者线程被中断时,也能跳出等待。 void awaitUninterruptibly(); //与await基本相同,但是它不能在等待过程中响应中断 long awaitNanos(long var1) throws InterruptedException; //线程等待,指定最长等待时间,单位ns boolean await(long var1, TimeUnit var3) throws InterruptedException; //线程等待,指定最长等待时间 boolean awaitUntil(Date var1) throws InterruptedException; //线程等待,指定最长等待到某个时间 void signal(); //用于唤醒一个等待中的线程 void signalAll(); //唤醒所有等待中的线程
Demo
public class ConditionTest implements Runnable{
public static ReentrantLock lock = new ReentrantLock();
public static Condition condition = lock.newCondition();
@Override
public void run() {
try{
lock.lock();
System.out.println(Thread.currentThread().getName() +",Thread is await,time:"+getCurrentDateTime());
condition.await(); //线程等待直到其他线程唤醒
System.out.println(Thread.currentThread().getName() + ",Thread is going on,time:"+ getCurrentDateTime());
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
private String getCurrentDateTime() {
DateFormat fdt = DateFormat.getDateTimeInstance();
return fdt.format(new Date());
}
public static void main(String[] args) {
ConditionTest cond = new ConditionTest();
Thread thread1 = new Thread(cond,"Thread-t1");
thread1.start();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
lock.lock();
condition.signal(); //主线程唤醒一个正在等待的线程
lock.unlock();
}
}
结果:
Thread-t1,Thread is await,time:2020-5-15 18:14:14
Thread-t1,Thread is going on,time:2020-5-15 18:14:19
参考:《Java 高并发程序升级》