一、管程法
/** * 并发协作模型:生产者消费者实现方式:管程法 * 借助缓冲区 * @author DARK * */ public class CoTest01 { public static void main(String[] args) { SynContainer container=new SynContainer(); new Productor(container).start(); new Consumer(container).start(); } } //生产者 class Productor extends Thread{ SynContainer container; public Productor(SynContainer container) { this.container = container; } //生产 @Override public void run() { for(int i=1;i<100;i++) { System.out.println("生产"+i+"个馒头"); container.push(new SteamedBun(i)); } } } //消费者 class Consumer extends Thread{ SynContainer container; public Consumer(SynContainer container) { this.container = container; } //消费 @Override public void run() { for(int i=1;i<100;i++) { System.out.println("消费"+container.pop().id+"个馒头"); } } } //缓冲区 class SynContainer{ SteamedBun[] buns=new SteamedBun[10];//存储数据容器 int count=0;//计数器 //存储 生产 public synchronized void push(SteamedBun bun) { //何时能生产 容器存在空间 if(count==buns.length) { try { this.wait();//线程阻塞。消费者通知生产解除 } catch (InterruptedException e) { e.printStackTrace(); } } buns[count]=bun; count++; this.notifyAll();//有数据 唤醒消费 } //获取 消费 public synchronized SteamedBun pop() { //何时消费 容器中是否存在数据 //有数据 消费,无数据 等待 if(count==0) { try { this.wait();//线程阻塞。生产者通知消费解除 } catch (InterruptedException e) { e.printStackTrace(); } } count--; SteamedBun bun=buns[count]; this.notifyAll();//有空间 唤醒生产 return bun; } } //数据 class SteamedBun{ int id; public SteamedBun(int id) { this.id = id; } }
二、信号灯法
/** * 生产者消费者模式 信号灯法 * 借助标志位 * @author DARK * */ public class CoTest02 { public static void main(String[] args) { Tv tv=new Tv(); new Actor(tv).start(); new Watcher(tv).start(); } } //生产者 演员 class Actor extends Thread{ Tv tv; public Actor(Tv tv) { this.tv=tv; } @Override public void run() { for(int i=0;i<20;i++) { if(i%2==0) { tv.play("奇葩说"); }else { 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.listen(); } } } //同一个资源 电视 class Tv{ String voice; //信号灯 T:演员表演,观众等待 F:观众观看,演员等待 boolean flag=true; //表演 public synchronized void play(String voice) { //演员等待 if(!flag) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //表演时刻 System.out.println("表演了:"+voice); this.voice=voice; this.notifyAll(); //切换标志 this.flag=!this.flag; } //观看 public synchronized void listen() { //观众等待 if(flag) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //观看时刻 System.out.println("听到了:"+voice); this.notifyAll(); //切换标志 this.flag=!this.flag; } }