看好了,我只表演一次
/**
* 重入锁的好搭档:Condition条件
* 如果大家理解了Object.wait()和Object.notify()方法的话,就能很容易地理解Condition对象了。
* 它和wait()和notify()方法的作用是大致相同的。但是wait()方法和notify()方法是和synchronized关键字合作使用的,
* 而Condtion是与重入锁相关联的。
* 通过Lock接口(重入锁就实现了这个接口)的Condtion 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()方法时候,
* 线程会重新获得锁并继续执行。或者当线程被中断时,也能跳出等待。这和Object.wait()方法很相似。
* awaitUninterruptibly()和await()方法类似,但它不会再等待过程中响应中断。
* singal() 用于唤醒一个等待队列中的线程。singalAll()是唤醒所有等待线程。
*/
public class ConditionExample 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() + " 获取到锁...");
//等待
condition.await();
System.out.println(Thread.currentThread().getName() + " 执行完成");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
//释放锁
lock.unlock();
System.out.println(Thread.currentThread().getName() + " 释放锁");
}
}
public static void main(String[] a) throws InterruptedException {
ConditionExample re = new ConditionExample();
Thread t1 = new Thread(re,"1 号线程 ");
t1.start();
//主线程sleep,1号线程会一直等待.直到获取到1号线程的锁资源,并将其唤醒.
Thread.sleep(2000);
//获得锁
lock.lock();
//唤醒前必须获得当前资源对象的锁
condition.signal();
//释放锁
lock.unlock();
}
}