ReentrantLock实现多个线程顺序打印

87 阅读1分钟
package org.example.juclearning.learning02;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class RenDa {
    public static void main(String[] args) throws InterruptedException {
        TargetClass targetClass = new TargetClass(5);
        Condition a = targetClass.newCondition();
        Condition b = targetClass.newCondition();
        Condition c = targetClass.newCondition();

        new Thread() {
            @Override
            public void run() {
                targetClass.print("a", a, b);
            }
        }.start();

        new Thread() {
            @Override
            public void run() {
                targetClass.print("b", b, c);
            }
        }.start();

        new Thread() {
            @Override
            public void run() {
                targetClass.print("c", c, a);
            }
        }.start();
        Thread.sleep(1000);

        try {
            targetClass.lock();
            a.signal();
        } finally {
            targetClass.unlock();
        }
    }


}

class TargetClass extends ReentrantLock {
    int looperNumber;

    public TargetClass(int looperNumber) {
        this.looperNumber = looperNumber;
    }

    public void print(String content, Condition currentRoom, Condition nextRoom) {
        for (int i = 0; i < looperNumber; i++) {
            try {
                lock();

                currentRoom.await();
                System.out.print(content);
                nextRoom.signalAll();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            } finally {
                unlock();

            }
        }

    }


}

代码的总体思路是,将三个不同的线程放到三个不同的房间内部。然后依次叫醒下一个线程。ReentrantLock的方便之处是可以精确唤醒,相比较于前几篇文章中的wait/notifyAll方法,不需要避免虚假唤醒的while循环。