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!
广告