2021-01-26

线程之间如何通信

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/

派代: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