1、利用缓冲区解决:管程法
// 生产者、消费者、产品、缓冲区public class TestPC { public static void main(String[] args) { SynContainer container = new SynContainer(); new Production(container).start(); new Consumer(container).start(); }}// 生产者class Production extends Thread { SynContainer container; public Production(SynContainer container) { this.container = container; } // 生产 @Override public void run() { for (int i = 0; i < 100; i++) { container.push(new Chicken(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().id + "只鸡"); } }}// 产品class Chicken { int id; // 编号 public Chicken(int id) { this.id = id; }}// 缓存区class SynContainer { // 需要一个容器大小 Chicken[] chickens = new Chicken[10]; // 容器计数器 int count = 0; // 生产者放入产品 public synchronized void push(Chicken chicken) { // 如果容器满了,需要等待消费者消费 if (count == chickens.length) { // 通知消费者消费,生产者等待 try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 如果没有满就丢入产品 chickens[count] = chicken; count++; //通知消费者消费 this.notifyAll(); } // 消费者消费产品 public synchronized Chicken pop() { // 判断能否消费 if (count == 0) { // 等待生产者生产,消费者等待 try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 如果可以消费 count--; Chicken chicken = chickens[count]; // 通知生产者 吃完了 this.notifyAll(); return chicken; }}
2、利用标志位解决:信号灯法
public class TestPC2 { 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++) { this.tv.watch(); } }}// 产品-->节目class TV extends Thread { // 演员表演,关众等待 T // 关众观看,演员等待 F String video; // 节目 boolean flag = true; // 标记 // 表演 public synchronized void play(String video) { if (!flag) { // 演员等待 try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("演员表演了:" + video); // 通知关众观看 this.notifyAll(); // 通知唤醒 this.video = video; this.flag = !this.flag; } // 观看 public synchronized void watch() { if (flag) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("观看了:"+video); // 通知演员表演 this.notifyAll(); this.flag = !this.flag; }}
原文转载:http://www.shaoqun.com/a/515865.html
派代:https://www.ikjzd.com/w/2197
patents:https://www.ikjzd.com/w/857
1、利用缓冲区解决:管程法//生产者、消费者、产品、缓冲区publicclassTestPC{publicstaticvoidmain(String[]args){SynContainercontainer=newSynContainer();newProduction(container).start();newConsumer(container).start();}}//生产者classPr
亚马逊t恤:亚马逊t恤
review:review
口述:墙那一面住的竟然是风尘女子(5/5):口述:墙那一面住的竟然是风尘女子(5/5)
让你垂涎欲滴的9大贵州小吃:雷家豆腐圆子(图) - :让你垂涎欲滴的9大贵州小吃:雷家豆腐圆子(图) -
与跟卖狗死磕到底的第30天,对方哭了:与跟卖狗死磕到底的第30天,对方哭了
No comments:
Post a Comment