1. 程式人生 > 其它 >執行緒按序交替Demo程式碼(執行緒通訊)

執行緒按序交替Demo程式碼(執行緒通訊)

技術標籤:充電ingJava 基礎

要求:

編寫一個程式,開啟 3 個執行緒,這三個執行緒的 ID 分別為 A、B、C,
每個執行緒將自己的 ID 在螢幕上列印 10 遍,要求輸出的結果必須按順序顯示。
如:ABCABCABC…… 依次遞迴

分析:

執行緒本來是搶佔式進行的,要按序交替,所以必須實現執行緒通訊,
那就要用到等待喚醒。可以使用同步方法,也可以用同步鎖。

編碼實現:

public class TestLoopPrint {
    public static void main(String[] args) {
        AlternationDemo ad = new AlternationDemo();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    ad.loopA();
                }
            }
        }, "A").start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    ad.loopB();
                }
            }
        }, "B").start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    ad.loopC();
                }
            }
        }, "C").start();
    }
}

class AlternationDemo {
    private int number = 1;//當前正在執行的執行緒的標記
    private Lock lock = new ReentrantLock();
    Condition condition1 = lock.newCondition();
    Condition condition2 = lock.newCondition();
    Condition condition3 = lock.newCondition();

    public void loopA() {
        lock.lock();
        try {
            if (number != 1) { //判斷
                condition1.await();
            }
            System.out.println(Thread.currentThread().getName());//列印
            number = 2;
            condition2.signal();
        } catch (Exception e) {
        } finally {
            lock.unlock();
        }
    }

    public void loopB() {
        lock.lock();
        try {
            if (number != 2) { //判斷
                condition2.await();
            }
            System.out.println(Thread.currentThread().getName());//列印
            number = 3;
            condition3.signal();
        } catch (Exception e) {
        } finally {
            lock.unlock();
        }
    }

    public void loopC() {
        lock.lock();
        try {
            if (number != 3) { //判斷
                condition3.await();
            }
            System.out.println(Thread.currentThread().getName());//列印
            number = 1;
            condition1.signal();
        } catch (Exception e) {
        } finally {
            lock.unlock();
        }
    }
}

以上編碼就滿足需求。建立三個執行緒,分別呼叫loopA、loopB和loopC方法,這三個執行緒使用condition進行通訊。