天天看点

循环打印线程输出123

面试时要求给出一个循环打印线程123的问题,特在此记录一下

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

public class CycleCallABC {

    private int num = 1;
    ReentrantLock lock = new ReentrantLock();
    Condition condition1 = lock.newCondition();
    Condition condition2 = lock.newCondition();
    Condition condition3 = lock.newCondition();

    public void sub1()  {
        try{
            lock.lock();
            while (num != 1){
                try {
                    condition1.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            num = 2;
            Thread.sleep(1000);
            System.out.println("线程1运行完毕");
            condition2.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    public void sub2()  {
        try{
            lock.lock();
            while (num != 2){
                try {
                    condition2.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            num = 3;
            Thread.sleep(1000);
            System.out.println("线程2运行完毕");
            condition3.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void sub3()  {
        try{
            lock.lock();
            while (num != 3){
                try {
                    condition3.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            num = 1;
            Thread.sleep(1000);
            System.out.println("线程3运行完毕");
            condition1.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        CycleCallABC cycleCallABC = new CycleCallABC();
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true){
                    cycleCallABC.sub1();
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true){
                    cycleCallABC.sub2();
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true){
                    cycleCallABC.sub3();
                }
            }
        }).start();
    }
}