一道基础的多线程题目(二)

  以前使用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控制的,咱们没法决定。线程

相关文章
相关标签/搜索