執行緒按序交替Demo程式碼(執行緒通訊)
阿新 • • 發佈:2021-02-04
要求:
編寫一個程式,開啟 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進行通訊。