多线程-线程间通信-等待唤醒机制-代码优化

  1 package multithread4;
  2 
  3 
  4 
  5 
  6 /*
  7  * 等待/唤醒机制。
  8  * 
  9  * 涉及的方法:
 10  * 
 11  * 1,wait();让线程处于冻结状态,被wait的线程会被存储到线程池(等待集)中。
 12  * 2,notify();唤醒线程池中的一个线程(任意)
 13  * 3,notifyAll();唤醒线程池中的所有线程。
 14  * 
 15  * 这些方法都必须定义在同步中。
 16  * 因为这些方法是用于操作线程状态的方法。
 17  * 必须要明确到底操作的是哪个锁上的线程。
 18  * 
 19  * 为什么操作线程的方法wait notify notifyAll定义在了Object类中。
 20  * 
 21  * 因为这些方法是监视器的方法。监视器其实就是锁。
 22  * 锁可以是任意的对象,而任意的对象调用的方法一定定义在Object类中
 23  * 
 24  * 
 25  */
 26 
 27 //资源
 28 class Resource{
 29     private String name;
 30     private String sex;
 31     private boolean flag = false;
 32     
 33     public synchronized void set(String name,String sex) {
 34         if (flag) {
 35             try {
 36                 this.wait();
 37             } catch (InterruptedException e) {
 38                 
 39             }
 40             
 41         }
 42         this.name =name;
 43         this.sex = sex;
 44         flag = true;
 45         this.notify();
 46         
 47     }
 48     public synchronized void out() {
 49         if (!flag) {
 50             try {
 51                 this.wait();
 52             } catch (InterruptedException e) {
 53                 
 54             }
 55         }
 56         System.out.println(name+"...."+sex);
 57         flag = false;
 58         notify();
 59     }
 60 }
 61 
 62 //输入
 63 class Input implements Runnable{
 64     Resource r;
 65 //    Object obj = new Object();
 66     public Input(Resource r) {
 67         this.r = r;
 68     }
 69     public void run() {
 70         int x = 0;
 71         while(true) {        
 72             if (x==0) {
 73                 r.set("mike", "nan");
 74             }else {
 75                 r.set("丽丽", "女女女");
 76             }                        
 77             x = (x+1)%2;
 78         }
 79     }
 80 }
 81 
 82 //输出
 83 class Output implements Runnable{
 84     Resource r;
 85     public Output(Resource r) {
 86         this.r = r;
 87     }
 88     public void run() {
 89         while(true) {
 90             r.out();                    
 91         }    
 92     }
 93 }
 94 
 95 
 96 public class ResourceDemo3 {
 97 
 98     public static void main(String[] args) {
 99         //创建资源
100         Resource r = new Resource();
101         //创建任务
102         Input in = new Input(r);    
103         Output out = new Output(r);
104         //创建线程,执行路径
105         Thread t1 = new Thread(in);
106         Thread t2 = new Thread(out);
107         //开启线程
108         t1.start();
109         t2.start();
110     }
111 
112 }
RsourceDemo3

 

posted @ 2021-11-10 22:38  doremi429  阅读(21)  评论(0编辑  收藏  举报