首页 > 其他分享 >生产者与消费者问题

生产者与消费者问题

时间:2024-03-25 11:26:09浏览次数:20  
标签:消费者 生产者 clerk System 问题 线程 println new productNum

  1. 建立一个clerk类,用来建立全局变量货物参数。

class clerk {
public static int productNum = 0;
}

2.在class Test3类中创建clerk的对象c,通过new Thread(new Runnable( ) , "线程名称" )建立线程。通过Thread.start( )开启线程。

3.重写Runnable方法,并通过synchronized同步锁避免线程之间的竞争,引入对象c确保只有一个线程访问clerk对象。

4.通过while(true){ }无限循环设置条件, productNum = 0时开始生产,当 productNum < 4 时,productNum++,直到结束while循环。c.notify唤醒等待中的线程。

5.如果 productNum != 0,则生产者线路会进入等待状态,保证只有在货物为0时开启线路。

6.被唤醒的消费者线路开始运行,当 productNum = 0时结束运行,唤醒生产者线路,以此往复。

package day15;

/**

  • 生产者与消费者问题
    */
    public class Test3 {
    public static void main(String[] args) {
    clerk c = new clerk();
    new Thread(new Runnable() {//生产者
    @Override
    public void run() {
    synchronized (c){ //确保只有一个线程访问clerk对象,避免竞争。
    while(true){
    if(c.productNum == 0 ){
    System.out.println("开始生产" );
    while(c.productNum < 4){
    c.productNum ++;
    System.out.println("当前库存为:" + c.productNum);
    System.out.println("结束生产,当前库存为:" + c.productNum);
    } c.notify();//唤醒等待中的线程,这里是唤醒消费者线程。
    }else{
    try {
    c.wait();//使当前线程进入等待状态,并释放对象的锁。确保只有在库存等于0时才会进入生产过程。
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    }
    }
    },"生产者").start();
    new Thread(new Runnable() { //消费者
    @Override
    public void run() {
    synchronized (c){
    while(true){
    if(c.productNum == 4){
    System.out.println("开始消费,当前库存为:" + c.productNum );
    while(c.productNum > 0){
    c.productNum --;
    System.out.println("当前库存为:" + c.productNum);
    }
    System.out.println("结束消费,当前库存为:" + c.productNum);
    c.notify();
    }else{
    try {
    c.wait();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    }
    }
    },"消费者").start();
    }
    }

class clerk {
public static int productNum = 0;
}````````

标签:消费者,生产者,clerk,System,问题,线程,println,new,productNum
From: https://www.cnblogs.com/460759461-zeze/p/18093978

相关文章

  • 拦截器不生效的问题处理
    拦截器没有注册到容器中,不能被容器管理 主要由以下两个步骤:自定义拦截器类实现HandlerInterceptor接口自定义WebMvc配置类实现WebMvcConfigurer接口,添加自定义拦截器类主要是第二步缺少。第一步:自定义拦截器UserInterceptor:publicclassUserInterceptorimplemen......
  • JavaScript:void(0) 用法及常见问题解析
    JavaScript:void(0)用法及常见问题解析javascript:void(0);是一种在JavaScript和网页开发中经常使用的技术,尤其在处理链接的行为时。本文将深入探讨javascript:void(0);的用法,以及在使用过程中可能遇到的常见问题和解决方法。什么是javascript:void(0);?javascript:v......
  • 传统FTP存在哪些问题?为什么一定要进行FTP替代?
    FTP在文件传输领域,可算是一位老大哥了!早出现于1970年代,那个时候,它是解决文件传输问题的最佳方案了,但是对着网络的发展,以及企业的需求变化,传统的FTP的问题就逐渐凸显出来了,所以很多企业开始寻找FTP替代的产品。我们先来看看传统FTP有哪些优势,可以风靡怎么多年:1、简单易用:FTP是......
  • wsl docker 和 ubuntu 冲突问题
    https://blog.csdn.net/weixin_44825912/article/details/136565219问题如下:wsl安装成功,但打开时出现多行报错无法使用。PSC:\WINDOWS\system32>wsl<3>WSL(8)ERROR:CreateProcessParseCommon:754:getpwuid(0)failed2Processingfstabwithmount-afailed.<3>......
  • 图解二维完全背包问题——降维打击
    例题例题:518.零钱兑换II概述:给你一个整数数组coins表示不同面额的硬币,另给一个整数amount表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回0。假设每一种面额的硬币有无限个。题目数据保证结果符合32位带符号整数。......
  • 【DP】01背包问题与完全背包问题
    一、01背包问题有 N件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包......
  • 内网渗透-通信问题
    内网渗透-通信tcpdump-n-ieth0udpdstport53抓取流量端口转发linux下的端口转发:iptables、firewallmeterpreter端口转发(反弹shell后,meterpreter输入)portfwdadd-l9999-rip-p80:添加路由portfwdlist:打印端口映射portfwddelete-l9999-rip-p80:删除路由......
  • 毕设小问题
    您可以在页面加载完成后,即在onLoad函数中的获取消息列表数据成功后,再调用wx.pageScrollTo实现页面滚动到底部。这样可以确保在页面初始化时已经加载了数据,并且在获取数据后再进行页面滚动。以下是一个示例代码,展示如何在正确的位置调用wx.pageScrollTo:onLoad(){le......
  • Python问题异常处理与日志结合
    我们掌握了try-except来处理程序运行中可能遇到的异常,以及使用logging来记录程序运行日志,该篇文章就结合二者来讲讲如何记录程序运行过程中的各种事件、状态信息以及遇到的异常情况,以便于追踪、诊断和解决程序运行时的问题。目录一、配置日志记录器 (logging.Logger)二、......
  • redis实际应用场景及并发问题的解决
    业务场景接下来要模拟的业务场景:每当被普通攻击的时候,有千分之三的概率掉落金币,每回合最多爆出两个金币。1.每个回合只有15秒。2.每次普通攻击的时间间隔是0.5s3.这个服务是一个集群(这个要求暂时不实现)编写接口,实现上述需求。核心问题可以想到要解决的主要问题是,1.如何......