Java多线程-线程间通信wait notify

等待/唤醒机制

触及办法:

1,wait()  :让线程处于解冻状况,被wait的线程会被存储到线程池中。只要被同一个对象调用 notify 或许 notifyAll 办法才能唤醒此线程.

2,notify() :唤醒线(程池中)同一对象调用 wait 处于休眠状况的线程(随便任性的)。

3,notifyAll()  :唤醒线程池中的应用同一对象调用 wait出于休眠状况的一切线程。

这些办法都必须定义在同步中,

条件:必须是多个线程应用同一把锁。

 

由于这些办法都是用于操作线程状况的办法。

必须明白究竟操作的是哪个锁上的线程。

 

为甚么操作线程的办法wait,notify,notifyAll定义在Object类中?

由于这些办法是监督器的办法,监督器其实就是锁。

锁可使随便任性的对象,随便任性的对象调用的办法必定定义在Object类中。

 

线程间的通信:

多个线程在处理同一个资本,但义务却不合。

ResourceDemo.java

class Resource {
   String name;
   String sex;
   boolean b = true;
}

class Input implements Runnable {
   Resource r;
 

  Input(Resource r) {
      this.r = r;
   }

   public void run() {
      boolean flag = true;
      while (true) {
        synchronized (r) {
           if (r.b)
              try {
                 r.wait();
       } catch (InterruptedException e) {}
           else {
              if (flag) {
                 r.name = "mike";
                 r.sex = "man";
                 flag = false;
       } else {
                 r.name = "丽丽";
                 r.sex = "女女女女女女";
                 flag = true;
              }
              r.b = true;
              r.notify();
           }
        }
      }
   }
}

class Output implements Runnable {
   Resource r;


  Output(Resource r) {
      this.r = r;
   }

   public void run() {
      while (true) {
        synchronized (r) {
           if (!r.b)
              try {
                 r.wait();
          } catch (InterruptedException e) {}
           else {
              System.out.println("name:" + r.name + ";  sex:" + r.sex);
              r.b = false;
              r.notify();
           }
        }
      }
   }
}

class ResrouceDemo {
   public static void main(String[] args) {
      Resource r = new Resource();
      Input in = new Input(r);
      Output out = new Output(r);
      Thread t1 = new Thread(in);
      Thread t2 = new Thread(out);
      t1.start();
      t2.start();
      System.out.println("Hello World!");
   }
}

优化后的代码 ResourceDemo3.java

class Resource {
   private String name;
   private String sex;
   private boolean flag = false;

   public synchronized void set(String name, String sex) {
      if (flag)
        try {
           this.wait();
    } catch (InterruptedException e) {}
      this.name = name;
      this.sex = sex;
      flag = true;
      this.notify();
   }

   public synchronized void out() {
      if (!flag)
        try {
           this.wait();
    } catch (InterruptedException e) {}
      System.out.println(name + "...+...." + sex);
      flag = false;
      notify();
   }
}

// 输入
class Input implements Runnable {
   Resource r;

  Input(Resource r) {
      this.r = r;
   }
 
   public void run() {
      int x = 0;
      while (true) {
        if (x == 0) {
           r.set("mike", "nan");
    } else {
           r.set("丽丽", "女女女女女女");
        }
        x = (x + 1) % 2;
      }
   }
}

// 输入
class Output implements Runnable {

  Resource r;

  Output(Resource r) {
      this.r = r;
   }

   public void run() {
      while (true) {
        r.out();
      }
   }
}

class ResourceDemo3 {
   public static void main(String[] args) {
      Resource r = new Resource();
      Input in = new Input(r);
      Output out = new Output(r);
      Thread t1 = new Thread(in);
      Thread t2 = new Thread(out);
      t1.start();
      t2.start();
   } }