首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 執行緒間通訊:共享旗標協作繪製三角形

     編輯:Java 程式設計入門

執行緒協作核心模式:共享變數 + 輪詢等待

本範例展示兩條執行緒透過共享 flag 變數協作,交替執行繪製實心三角形:執行緒 1 輸出前導空格,執行緒 2 輸出星號與換行。雖屬教學示範(生產環境應用 wait/notify 或 BlockingQueue),但清晰展示了「輪流執行」的基本邏輯。

完整程式碼:mainThread.java

public class mainThread {
    public static int flag = 0; // 共享旗標:1=執行緒1工作, 2=執行緒2工作
    int count = 10; // 三角形高度

    public static void main(String[] arg) {
        new mainThread();
    }

    mainThread() {
        thread1 t1 = new thread1(this.count);
        thread2 t2 = new thread2(this.count);
        t1.start();
        t2.start();
        flag = 1; // 讓執行緒 1 先工作
    }

    // 執行緒 1:輸出每行前導空格
    class thread1 extends Thread {
        int count1;
        thread1(int i) { count1 = i; }

        public void run() {
            while (true) {
                if (count1 <= 0) break;
                if (mainThread.flag == 1) { // 輪到我
                    for (int i = 0; i < count1; i++)
                        System.out.print(" ");
                    count1--;
                    mainThread.flag = 2; // 交棒給執行緒 2
                }
            }
        }
    }

    // 執行緒 2:輸出星號並換行
    class thread2 extends Thread {
        int count2;
        thread2(int i) { count2 = i; }

        public void run() {
            int count = 0;
            while (true) {
                if (count >= count2) break;
                if (mainThread.flag == 2) { // 輪到我
                    for (int i = 0; i < (count * 2 + 1); i++)
                        System.out.print("*");
                    System.out.print("\n");
                    count++;
                    mainThread.flag = 1; // 交棒給執行緒 1
                }
            }
        }
    }
}

執行結果:實心三角形

         *
        ***
       *****
      *******
     *********
    ***********
   *************
  ***************
 *****************
*******************

邏輯流程分析

步驟執行緒 1 (空格)執行緒 2 (星號)flag 狀態
1輸出 9 空格,count1→9等待1→2
2等待輸出 1 星號,換行,count→12→1
3輸出 8 空格,count1→8等待1→2
4等待輸出 3 星號,換行,count→22→1
...交替進行交替進行1↔2

⚠️ 此實作的缺陷與改進

  • 忙碌等待:while(true) if(flag==...) 空轉消耗 CPU,無休眠
  • 可見性風險:flag 未宣告 volatile,多核心下可能看不到最新值
  • 無同步保護:複合操作(檢查+修改)非原子,競態條件風險

改進版:wait/notify 機制(下一篇詳細說明)

// 概念示意
synchronized(lock) {
    while (!myTurn) lock.wait(); // 釋放鎖進入等待集
    // 執行工作
    myTurn = false;
    lock.notifyAll(); // 喚醒其他執行緒
}

現代最佳實務:BlockingQueue 管道通訊

BlockingQueue queue = new LinkedBlockingQueue<>();
// 生產者
queue.put("data");
// 消費者
String data = queue.take(); // 自動阻塞等待,無忙碌等待、天然同步

教學價值總結

此範例雖簡陋,但直觀展示了多執行緒協作的三要素:

  1. 共享狀態(flag)
  2. 輪流條件(if 檢查)
  3. 狀態交接(修改 flag)

理解這層邏輯,進而掌握 wait/notify、Lock/Condition、BlockingQueue、CompletableFuture 等高階協作機制才有根基。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved