线程通信
wait()方法与notify()与notifyAll()方法
生产者与消费者解决方法:
package syn; //测试-生产者消费者模型-->利用缓冲器解决:管程法 //需要对象:生产者、消费者、产品、缓冲区 public class TestPC { public static void main(String[] args) { SynContainer container = new SynContainer(); new Producter(container).start(); new Consumer(container).start(); } } //生产者 class Producter extends Thread{ SynContainer container; public Producter(SynContainer container){ this.container = container; } //生产 @Override public void run() { for (int i = 0; i < 100; i++) { container.push(new Product(i)); System.out.println("生产了"+i+"个产品"); } } } //消费者 class Consumer extends Thread{ SynContainer container; public Consumer(SynContainer container){ this.container = container; } @Override public void run() { //消费 for (int i = 0; i < 100; i++) { System.out.println("消费了--》"+container.pop().getId()+"只鸡"); } } } //产品 class Product{ private int id;//产品编号 public Product() { } public Product(int id) { this.id = id; } public int getId() { return id; } } //缓冲区 class SynContainer{ //缓冲区容量大小 Product[] products = new Product[10]; // 容器计数器 private int count = 0; // 生产者放入产品 public synchronized void push(Product product){ // 如果容器满了,就需要等待消费产品 if (count == products.length){ // 通知消费者消费,生产者等待 try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }else { // 如果容器未满,生产者就生产产品 products[count] = product; count++; // 可以通知消费者可以消费了 this.notifyAll(); } } // 消费者消费产品 public synchronized Product pop(){ //判断能否消费 if (count == 0){ //等待生产者生产,消费者等待 try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //如果可以消费 count--; Product product = products[count]; //吃完了,通知生产者生产 this.notifyAll(); return product; } }
package syn; //测试生产者消费者问题2--》信号灯法,标志位解决 public class TestPC02 { public static void main(String[] args) { TV tv = new TV(); new Player(tv).start(); new Watcher(tv).start(); } } //生产者--》演员 class Player extends Thread{ TV tv; public Player(TV tv){ this.tv = tv; } @Override public void run() { for (int i = 0; i < 20; i++) { if(i%2 == 0){ this.tv.play("快乐大本营播放中"); }else{ this.tv.play("正在播放电视剧"); } } } } //消费者--》观众 class Watcher extends Thread{ TV tv; public Watcher(TV tv){ this.tv = tv; } @Override public void run() { for (int i = 0; i < 20; i++) { tv.watch(); } } } //产品--》节目 class TV{ //演员表演,观众等待 T //观众观看,演员等待 F String voice;//表演的节目 boolean flag = true;//标志位 //表演 public synchronized void play(String voice){ if (!flag){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("演员表演了:"+voice); //通知观众观看 this.notifyAll(); this.voice = voice; this.flag = !this.flag; } //观看 public synchronized void watch(){ if (flag){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("观众观看了:"+voice); //通知演员表演 this.notifyAll(); this.flag = !this.flag; } }