线程之间的相互通信
notify() 若是没有线程在wait,那也没有任何问题
1.wait()和notify() 需要在同步代码块使用
2.wait和notify方法必须要有锁对象调用
利用锁对象建立线程池,所以必须锁对象一致,不然会建立不同的线程池
1 /* 2 线程的通信,互相调用 两个线程 3 需求: 生产者 消费者 , 生产一个产品 就消费一个产品 , 产品是共享的 4 5 6 */ 7 //产品类 8 class Product{ 9 10 String name; //名字 11 12 double price; //价格 13 14 boolean flag = false; //产品是否生产完毕的标识,默认情况是没有生产完成。 15 16 } 17 18 //生产者 19 class Producer extends Thread{ 20 21 Product p ; //产品 22 23 public Producer(Product p) { 24 this.p = p ; 25 } 26 27 @Override 28 public void run() { 29 int i = 0 ; 30 while(true){ 31 synchronized (p) { 32 if(p.flag==false){ 33 if(i%2==0){ 34 p.name = "苹果"; 35 p.price = 6.5; 36 }else{ 37 p.name="香蕉"; 38 p.price = 2.0; 39 } 40 System.out.println("生产者生产出了:"+ p.name+" 价格是:"+ p.price); 41 p.flag = true; 42 i++; 43 p.notifyAll(); //唤醒消费者去消费 44 }else{ 45 //已经生产 完毕,等待消费者先去消费 46 try { 47 p.wait(); //生产者等待 48 } catch (InterruptedException e) { 49 e.printStackTrace(); 50 } 51 } 52 53 } 54 } 55 } 56 } 57 58 59 //消费者 60 class Customer extends Thread{ 61 62 Product p; 63 64 public Customer(Product p) { 65 this.p = p; 66 } 67 68 @Override 69 public void run() { 70 while(true){ 71 synchronized (p) { 72 if(p.flag==true){ //产品已经生产完毕 73 System.out.println("消费者消费了"+p.name+" 价格:"+ p.price); 74 p.flag = false; 75 p.notifyAll(); // 唤醒生产者去生产 76 }else{ 77 //产品还没有生产,应该 等待生产者先生产。 78 try { 79 p.wait(); //消费者也等待了... 80 } catch (InterruptedException e) { 81 e.printStackTrace(); 82 } 83 } 84 } 85 } 86 } 87 } 88 89 90 public class Demo9 { 91 92 public static void main(String[] args) { 93 Product p = new Product(); 94 Producer pr = new Producer(p); 95 Customer c = new Customer(p); 96 pr.start(); 97 c.start(); 98 99 } 100 101 }