首页天道酬勤多线程生产者与消费者模型,生产者和消费者之间的关系主要是

多线程生产者与消费者模型,生产者和消费者之间的关系主要是

admin 02-23 15:09 128次浏览

这是一个线程同步问题,生产者和消费者共享同一个资源,并且生产者和消费者之间相互依赖,互为条件。

对于生产者,在不生产产品前必须通知消费者等待,但在生产产品后,需要立即通知消费者消费,在消费结束后,为了通知生产者消费结束,需要为消费生产者的消费者生产新产品的问题上,同步同步实现不能用于实现不同线程纪检的消息传递2 .线程通信提供的方法名称角色wait ) )知道其他线程正在进行通知,http://www.Sina.cood notify ) )启动等待线程(随机启动) (notifyAll ) )对象中所有调用的wait ) ) )的方法的线程。 优先顺序高的东西优先安排。与sleep(抱着锁睡着)不同,会释放锁(不占用资源)。

3 .解决方法1同时合作模式“生产者/消费者模式”--- 注意:均是Object类的方法,都只能在同步方法或者同步代码块中使用,否则会抛出异常IIIegalMonitorStateException

生产者:负责生产数据的模块(可能是方法、对象、线程、流程); 消费者:负责数据处理的模块(可能是方法、对象、线程、进程); 缓冲区:消费者不能直接使用生产者的数据。 他们之间有缓冲器迷人的小海豚

package com.thread.senior; /** * @description:测试生产者消费者-----迷人的海豚* @ author : wt * @ createtime 33602021/11/1515336027 * @ version 33601.0 publicclasstestpc { publicstaticvoidmain (string [ ] args ) syncontainersyncontainer=newsyncontainer ); 产品生产程序=新产品(syn container; 客户计算机=新客户(syn container; producer.start (; consumer.start (; } }需要类产品扩展线程{//容器SynContainer container; 公共产品器(syncontainercontainer ) { this.container=container; //生产鸡@Override public void run () for ) intI=1; i=100; I )生产了第system.out.println(I )只鸡! ' ); container.product(newChicken(I ) ); }需要}}classconsumerextendsthread{//容器SynContainer container; 公共连接器(syncontainercontainer ) { this.container=container; //消费鸡@Override public void run () ) for(intI=1; i=100; I ) { System.out.println (消费者为' container.consume ().id '鸡') ); } }}class Chicken { int id; //鸡的编号publicchicken(intid ) { this.id=id; }}class SynContainer { //缓冲区的容器chicken [ ] chickens=new chicken [ 10 ]; //容器计数器int count=0; //生产者装满产品publicsynchronizedvoidproduct (chicken chicken )//容器后,生产者需要等待消费者消费if(count==Chickens.length )

} } chickens[count] = chicken; count ++; // 缓冲区里面有鸡了,开始通知消费者消费了 this.notifyAll(); } public synchronized Chicken consume(){ // 如果容器是空的,消费者不能进行消费,需要等到生产者生产鸡 if(count == 0 ) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //开始吃鸡了,取得是最后一只,并进行保存! count -- ; Chicken eatChicken = chickens[count]; // 我已经把鸡吃了,开始通知生产者继续生产了 this.notifyAll(); return eatChicken; }} 4.解决方法2

并发协作模型“生产者/消费者模式”--->信号灯法

给出一个标志,如果为真给一个true,如果为假给一个false。

package com.thread.senior;/** * @description: 测试生产者消费者----->信号灯法 * @author:wt * @createTime:2021/11/15 18:25 * @version:1.0 */public class TestSignal { public static void main(String[] args) { Cctv cctv = new Cctv(); new Palyer(cctv).start(); new Viewer(cctv).start(); }}class Palyer extends Thread{ // 需要cctv平台表演 Cctv cctv; public Palyer( Cctv cctv) { this.cctv=cctv; } @Override public void run() { for (int i = 0; i < 100; i++) { if (i%2==0){ cctv.perform("表演今平没"); }else { cctv.perform("拍抖音短视频"); } } }}class Viewer extends Thread{ // 需要cctv平台表演 Cctv cctv; public Viewer( Cctv cctv) { this.cctv=cctv; } @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println("观众正在观看"+ cctv.view()); } }}// 相当于一个信号塔,通过标识来通知生产者消费者class Cctv { // 演员节目 String item ; // 信号标识 boolean flag = true; //表演节目 public synchronized void perform (String item ){ //是否需要表演 if (!flag){ // 请等待观众看完上场表演 try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.flag= !this.flag; // 开始表演节目 this.item=item; System.out.println("演员"+ item); //通知 this.notifyAll(); } //观看节目 public synchronized String view (){ //是否有观看的表演 if (flag){ //正在表演,请等待观看 try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.flag= !this.flag; this.notifyAll(); return this.item; }} 5.应用场景:生产者和消费者问题 假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取走消费。如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产者等待,直到仓库的产品被消费者取走为止。如果仓库中没有产品,则消费者将产品取走消费,否则停止消费并等待,直到仓库中再次放入产品为止。
如何使用java.util.logging.SimpleFormatter为Tomcat的控制台日志指定单独的日志格式K8S之StatefulSet有状态服务详解CloudBest:干货 | 手把手带你搞定4大容器网络问题RoadRunner有哪些特性
java线程生产者消费者,Java生产者消费者的三种实现 多线程与高并发,Qt多线程
相关内容