一道基础的多线程题目(二)
之前使用wait()和notify()实现了循环打印字母和数字,而上篇博客讲了ReentrantLock,因此,这篇博客讲通过ReentrantLock来实现循环打印字母和数字,这里我们需要ReentrantLock与Condition搭配使用,
Condition主要方法为await()方法和signal()方法,他们必须在lock()方法和unlock()方法之间使用。这两个方法与Object的wait()方法和notify()方法作用一样。还是直接看代码来分析把。
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控制的,我们无法决定。

浙公网安备 33010602011771号