Java并发线程间通信

来源:互联网 发布:水墨风格网站源码 编辑:程序博客网 时间:2024/06/18 02:42

如果你知道进程间通信,那么就很容易理解线程间通信。 当您开发两个或多个线程交换一些信息的应用程序时,线程间通信很重要。

有三个简单的方法和一个小技巧,使线程通信成为可能。 所有三种方法都列在下面 -

编号方法描述1public void wait()使当前线程等到另一个线程调用notify()方法。2public void notify()唤醒在此对象监视器上等待的单个线程。3public void notifyAll()唤醒所有在同一个对象上调用wait()的线程。

这些方法已被实现为Object中的最终(final)方法,因此它们在所有类中都可用。 所有这三种方法只能从同步上下文中调用。

实例

这个例子显示了两个线程如何使用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);   }}
Java

当执行上述程序时,会产生以下结果 -

HiHiHow are you ?I am good, what about you?I am also doing fine!Great!
原创粉丝点击