Java 教程

Java 控制語句

面向物件程式設計

Java 內建類

Java 檔案處理

Java 錯誤與異常

Java 多執行緒

Java 同步

Java 網路程式設計

Java 集合

Java 介面

Java 資料結構

Java 集合演算法

高階 Java

Java 雜項

Java API 與框架

Java 類參考

Java 有用資源

Java - 執行緒間通訊



如果您瞭解程序間通訊,那麼您將更容易理解執行緒間通訊。

Java 中的執行緒間通訊

當您開發一個兩個或多個執行緒交換某些資訊的應用程式時,執行緒間通訊非常重要。執行緒間通訊是透過使用 wait()notify()notifyAll() Object 類 的方法來實現的。

用於執行緒間通訊的方法

有三種簡單的方法和一個小技巧可以使執行緒通訊成為可能。所有這三種方法都列在下面 -

序號 方法及描述
1

public void wait()

導致當前執行緒等待,直到另一個執行緒呼叫 notify()。

2

public void notify()

喚醒一個正在等待此物件監視器的執行緒。

3

public void notifyAll()

喚醒所有在同一個物件上呼叫 wait() 的執行緒。

這些方法已在 Object 中實現為final方法,因此它們在所有類中都可用。所有三個方法只能在synchronized上下文中呼叫。

Java 中執行緒間通訊的示例

此示例顯示了兩個執行緒如何使用wait()notify()方法進行通訊。您可以使用相同的概念建立一個複雜的系統。

class Chat {
   boolean flag = false;

   public synchronized void Question(String msg) {
      if (flag) {
         try {
            wait();
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }
      System.out.println(msg);
      flag = true;
      notify();
   }

   public synchronized void Answer(String msg) {
      if (!flag) {
         try {
            wait();
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }

      System.out.println(msg);
      flag = false;
      notify();
   }
}

class T1 implements Runnable {
   Chat m;
   String[] s1 = { "Hi", "How are you ?", "I am also doing fine!" };

   public T1(Chat m1) {
      this.m = m1;
      new Thread(this, "Question").start();
   }

   public void run() {
      for (int i = 0; i < s1.length; i++) {
         m.Question(s1[i]);
      }
   }
}

class T2 implements Runnable {
   Chat m;
   String[] s2 = { "Hi", "I am good, what about you?", "Great!" };

   public T2(Chat m2) {
      this.m = m2;
      new Thread(this, "Answer").start();
   }

   public void run() {
      for (int i = 0; i < s2.length; i++) {
         m.Answer(s2[i]);
      }
   }
}
public class TestThread {
   public static void main(String[] args) {
      Chat m = new Chat();
      new T1(m);
      new T2(m);
   }
}

當以上程式編譯並執行時,它會產生以下結果 -

輸出

Hi
Hi
How are you ?
I am good, what about you?
I am also doing fine!
Great!
廣告