java多線程,三個線程輪流執行順序打印ABC,循環5次。使用三個Condition實現。

package com.zhong.thread;

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

/**
 * 三個線程依次輸出A,B,C,循環5次。 使用Condition實現
 * 輸出結果:
 * ABC
 * ABC
 * ABC
 * ABC
 * ABC
 */
public class SequencePrintDemo {

    private static volatile int newPrintWho = 1; //下一個輸出

    private static ReentrantLock lock = new ReentrantLock();

    private static final Condition conditionA = lock.newCondition();
    private static final Condition conditionB = lock.newCondition();
    private static final Condition conditionC = lock.newCondition();

    private static final int TIMES = 5; //循環次數

    public static void main(String[] args) {
        Thread threadA = new Thread() {
            @Override
            public void run() {

                for (int i = 0; i < TIMES; i++) {
                    try{
                        lock.lock();
                        while (newPrintWho !=1){
                            conditionA.await(); //阻塞
                        }
                        System.out.print("A");
                        newPrintWho = 2;

                        conditionB.signalAll(); //喚醒ThreadB
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }finally {
                        lock.unlock();
                    }
                }

            }
        };

        Thread threadB = new Thread() {
            @Override
            public void run() {
                for (int i = 0; i < TIMES; i++) {
                    try{
                        lock.lock();
                        while (newPrintWho !=2){
                            conditionB.await(); //阻塞
                        }
                        System.out.print("B");
                        newPrintWho = 3;
                        conditionC.signalAll(); //喚醒ThreadC
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }finally {
                        lock.unlock();
                    }
                }
            }
        };
        Thread threadC = new Thread() {
            @Override
            public void run() {
                for (int i = 0; i < TIMES; i++) {
                    try{
                        lock.lock();
                        while (newPrintWho !=3){
                            conditionC.await(); //阻塞
                        }

                        System.out.println("C");
                        newPrintWho = 1;
                        conditionA.signalAll(); //喚醒ThreadA
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }finally {
                        lock.unlock();
                    }
                }
            }
        };


        threadA.start();
        threadB.start();
        threadC.start();

    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章