以前使用wait()和notify()实现了循环打印字母和数字,而上篇博客讲了ReentrantLock,所以,这篇博客讲经过ReentrantLock来实现循环打印字母和数字,这里咱们须要ReentrantLock与Condition搭配使用,ide
Condition主要方法为await()方法和signal()方法,他们必须在lock()方法和unlock()方法之间使用。这两个方法与Object的wait()方法和notify()方法做用同样。仍是直接看代码来分析把。spa
public static void main(String[] args) { final ReentrantLock lock = new ReentrantLock(true); final Condition charCondition = lock.newCondition(); final Condition numCondition = lock.newCondition(); new Thread(new Runnable() { @Override public void run() { List<String> list = Arrays.asList("A", "B", "C", "D", "E"); for (String str : list) { try { lock.lock(); System.out.println(str); numCondition.signal(); charCondition.await(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } } }).start(); new Thread(new Runnable() { @Override public void run() { List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); for (Integer i : list) { try { lock.lock(); System.out.println(i); charCondition.signal(); numCondition.await(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } } }).start();
经过代码看出,咱们声明了一个ReentrantLock对象和两个Condition。而后两个线程中都经过lock()方法来索取锁,而后打印各自的东西,而后唤醒另外一个线程,再将自身阻塞。代码逻辑其实跟wait(),notify()的实现逻辑是同样的。可是他们有一点很重要的区别:Condition能够准确的唤醒指定的线程,而notify()没法作到,他是由JVM控制的,咱们没法决定。线程