Java线程生产者消费者算法无法正常工作

2024-03-07

我正在尝试学习线程,因此我编写了一个示例生产者消费者问题,其中生产者生成从 1 到 10 的数字,而消费者必须显示它们。但只有消费者显示数字 1 并停止。

正如我所说,该程序写得不好,可能很荒谬,但我仍然想弄清楚为什么从 1 到 10 的所有数字都没有打印出来,因为我在编码时而不是从示例中记得最好。

我使用两个变量来跟踪生产者或消费者活动的完成情况,以便我可以执行另一个变量。

/getStatus(消费者 C) 传递消费者引用,以便生产者获得消费者的引用..并且它可以用于了解消费者的状态..就是这样../

import java.lang.Math;
public class Hello{

public static void main(String args[]) {

    System.out.println("---1");
    new Consumer().start();

}

}

class Producer extends Thread{

public int produce = 0;
public Consumer consumerObj =null;
int count = 1;
boolean producerStatus = false;

public void run(){

    System.out.println("---4");
    synchronized(this){

        do{

            System.out.println("---6");
            produce = produce+1;
            producerStatus = true;
            notify();
            consumerObj.consumerStatus = false;
            System.out.println("---9");
            count = count+1;

        }while(count<=10 && consumerObj.getStatus());

    }

}

public int getItem(){
    return produce;
}



public boolean getStatus(Consumer c){
    consumerObj = c;
    return producerStatus;

}

}

class Consumer extends Thread{

boolean consumerStatus = false;
int count =0;
public void run(){

    System.out.println("---2");
    Producer p = new Producer();
    p.getStatus(this);
    p.start();
    try{
        System.out.println("---3");
        synchronized(p){
            System.out.println("---5");
            p.wait();

            System.out.println("---8");
        }
    }
    catch(Exception e){
            System.out.println("exception");
    }

    synchronized(p){
        try{
            while(p.getStatus(this) && count<=9 ){

                System.out.println("---7");
                int consume = p.getItem();
                System.out.println("the produced item is ----->"+consume);
                count = count+1;
                p.producerStatus  = false;
                consumerStatus = true;
                p.wait();                   
                System.out.println("---10");

            }
        }
        catch(Exception e){
            System.out.println("exception");
        }

    }

}

public boolean getStatus(){

    return consumerStatus;

}
}

Output :

---1
---2
---3
---5
---4
---6
---9
---8
---7
the produced item is ----->1
---10

经过.. Suraj 的输入后.. 现在程序运行良好.. 见下文..

导入java.lang.Math; 公开课你好{

public static void main(String args[]) {

    System.out.println("---1");
    new Consumer().start();

}

}

class Producer extends Thread{

public int produce = 0;
public Consumer consumerObj =null;
int count = 1;
boolean producerStatus = false;

public void run(){

    System.out.println("---4");

        do{
            if(consumerObj.getStatus()){


            System.out.println("---6");
            produce = produce+1;
            System.out.println("---9 -- >produce is -->"+produce);
            producerStatus = true;
            synchronized(this){

            notify();
            System.out.println("---6.111");
            }

            consumerObj.consumerStatus = false;
            count = count+1;


            }


        }while(count<=10);


}

public int getItem(){

    return produce;

}

public boolean getStatus(Consumer c){

    consumerObj = c;
    return producerStatus;

}

}



class Consumer extends Thread{

boolean consumerStatus = true;
int count =1;
public void run(){

    System.out.println("---2");
    Producer p = new Producer();
    p.getStatus(this);
    p.start();//can a thread1 wait on an thread2 before the thread2 hass tarted and in this case wll notify on the scnd thread reaally notify therad1 ..
    try{
        System.out.println("---3");
        synchronized(p){
            System.out.println("---5");
            p.wait();

            System.out.println("---8");
        }
    }
    catch(Exception e){
            System.out.println("exception");
    }


        try{
            while(count<=10 ){

                System.out.println("---7");
                int consume = p.getItem();
                System.out.println("the produced item is ----->"+consume);
                count = count+1;
                p.producerStatus  = false;
                consumerStatus = true;
                synchronized(p){
                p.wait();   
                System.out.println("---10");        
                }


            }
        }
        catch(Exception e){
            System.out.println("exception");
        }


}

public boolean getStatus(){

    return consumerStatus;

}

}

好的。 程序错误。

  1. 消费者线程到来并等待锁。
  2. 生产者循环中的第一次迭代将调用notify,但不会释放锁,因为while循环位于synchronized块内。它将迭代 10 次而不释放锁,最终连续调用通知 10 次。
  3. 但是消费者只能唤醒一次,当消费者第二次调用wait()时,它会继续等待,因为现在没有人调用notify(因为生产者的所有10次迭代都结束了)

所以问题是消费者线程正在等待,但没有人通知它,因为生产者一次性完成了所有 10 次迭代。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java线程生产者消费者算法无法正常工作 的相关文章

  • 数组查找时间复杂度和。它是如何存储的

    众所周知 通过索引访问数组的时间复杂度是O 1 Java 的文档ArrayList 它由数组支持 对其也有同样的说法get手术 size isEmpty get set iterator 和 listIterator 操作以恒定时间运行 查
  • 面试问题 - 在排序数组 X 中搜索索引 i,使得 X[i] = i

    昨天面试时 我被问到了以下问题 考虑一个 Java 或 C 数组X它已排序并且其中没有两个元素是相同的 如何最好地找到索引i这样该索引处的元素也是i 那是X i i 作为澄清 她还给了我一个例子 Array X 3 1 0 3 5 7 in
  • Android 上的 setTimeOut() 相当于什么?

    我需要等效的代码setTimeOut call function milliseconds 对于安卓 setTimeOut call function milliseconds 您可能想查看定时任务 http developer andro
  • 如何从 .t​​xt 文件读取数据并将数据放入对象的数组列表中?

    到目前为止 我所写的内容是基于我目前对基本数组的了解 但我只是不明白如何使用数组列表 或如何从文件中读取 到目前为止我所写的内容有效 任何有助于修复我的代码以从文件中读取并使用数组列表的链接或建议将不胜感激 谢谢 public class
  • JSP重定向和传值

    我有一个 JSP 其中我重定向到另一个 jsp 例如 我在该jsp中没有任何其他数据 我想将值从该jsp index jsp 传递到重定向jsp login jsp 我将如何做到这一点 这里的 logonInput 是在struts con
  • 将 Spring Boot 应用程序部署到 Heroku 失败并显示“无效标志:--release -> [帮助 1]”

    当我尝试将代码部署到 Heroku 时 通过git push heroku master 我收到 Maven 错误 remote ERROR Failed to execute goal org apache maven plugins m
  • Java 创建 Thread 实例时会发生什么

    我有一个关于 Java 线程和操作系统线程的问题 我读了Java 线程与 Pthreads https stackoverflow com questions 5269535 java threads vs pthreads and Jav
  • Spring Batch:比较数据库之间的数据

    我有两个数据库 Oracle 和 MySQL 目标是将Oracle表中的值保存到MySQL中 要求 MySQL表中不存在数据 但我在理解 Spring Batch 时遇到了困难 步骤中 它包含itemReader itemProcessor
  • java.sql.SQLException: - ORA-01000: 超出最大打开游标数

    我收到 ORA 01000 SQL 异常 所以我有一些与之相关的疑问 最大打开游标是否与 JDBC 连接数完全相关 或者它们也与我们为单个连接创建的语句和结果集对象相关吗 我们正在使用连接池 有没有办法配置数据库中语句 结果集对象的数量 如
  • 在 Android 中使用 lambdaj

    有人尝试过在android开发中使用lambdaj库吗 当我创建一个简单的小型java应用程序时 它对我来说工作得很好 但我无法在android应用程序中使用它 UPDATE 我正在添加 lambdaj lambdaj 2 3 2 with
  • 如何在 Eclipse 中使用 Hibernate Tools 生成 DAO?

    我在用着 Eclipse Java EE IDE Web 开发人员 版本 Indigo 发布 使用 hibernate 工具 我对 Eclipse 中的 hibernate 很陌生 所以我学习如何配置 hibernate 并使用注释生成 P
  • GAE - Eclipse 中的开发服务器未更新?

    我在 Eclipse 上使用 Google AppEngine 开发服务器 我的本地网页似乎没有更新 直到我在开发服务器上进行了多次重新启动 使用 Eclipse 中的 运行 或 调试 按钮 我究竟做错了什么 基本流程是 更改 java 文
  • 无法运行简单的 doclet 程序:包 com.sun.javadoc 不存在

    我正在尝试运行一个简单的 doclet 程序 但无法编译它 javac cp cygdrive c Progra 2 Java jdk1 8 0 65 lib tools jar A java 但它抛出 A java 1 错误 包 com
  • 从 Perl 线程生成 Expect

    我正在编写一个脚本 该脚本需要定期 每 5 分钟 生成一个 Expect 进程来完成一些工作 下面是我的代码 它生成一个 Expect 进程并执行一些工作 脚本的主要进程始终在做一些其他工作 例如它可能等待用户输入 因为我在一个线程中调用这
  • 如何实现再次播放功能?

    我希望在游戏结束时得到提示 如果我还想再玩一次的话 并使用 Y N 输入 退出游戏或重复游戏 我该如何以最有效的方式解决这个问题 编辑 描述资源路径位置类型 类型 Main Main java ScaredyCat src se grupp
  • 何时以及为何使用缓冲输入和输出流? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我读到这些是为了减少磁盘 网络调用开销而使用的 这在写操作的情况下似乎很好 但是进行缓冲读取有什么好处呢 如果您按字节读取文件 则每次都会进
  • 仅在java中使用数组计算50的阶乘

    我是java的初学者 我有一个作业要编写一个完整的程序 使用数组计算 50 的阶乘 我无法使用像 biginteger 这样的任何方法 我只能使用数组 因为我的教授希望我们理解背后的逻辑 我猜 然而 他并没有真正教我们数组的细节 所以我在这
  • 如何使用自定义转换器访问 jOOQ 生成的例程字段作为值?

    我在访问生成例程的字段时遇到问题PL pgSQL 用户定义函数 返回JSON 数据类型结果 已经提到this https stackoverflow com q 62535195 6805866问题 这是我的结果get all orders
  • 如何在 SpringDoc OpenAPI 3 中引用文件?

    我有 Spring Boot 项目 我想在其中记录我的 API 这里是正在处理的 Web 服务的示例 ApiResponses value ApiResponse responseCode 200 content Content media
  • 文件构造函数说明

    我无法理解以下文件构造函数 public File String parent String child and public File File parent String child 参数有什么作用parent and child该文件

随机推荐

  • 无法将 Flask 部署到 Azure

    我正在尝试部署python flask to azure但无法打通 我创建了一个 api 服务Azure 这里是url for my api 并且它与python 3 https textclassifier azurewebsites n
  • PHP crypt() 的输出长度是多少? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions PHP的输出长度是多少crypt m
  • 如何在 SQL Server 中向用户定义的表类型添加索引或主键?

    我有一个用户定义的类型 我想向其中添加主键或索引 IF NOT EXISTS SELECT FROM sys types st JOIN sys schemas ss ON st schema id ss schema id WHERE s
  • 如何在uwp中为特定sdk定义条件编译器符号

    我正在 Visual Studio 2015 中编写一个 UWP 应用程序 最小 sdk 是 10240 最大是 14393 我想编写 sdk 特定代码 所以我想定义一个条件编译符号 我可以简单地在构建选项卡下的项目属性窗口中定义它 但是我
  • 推荐的 VBA IDE [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有推荐的 IDE 用于开发 Excel VBA 宏 提供合理的错误报告和代码完成 目前 我使用的是
  • 插入到android sqlite数据库中的特定行

    我正在寻找一种方法将新条目插入到 android 中的 sqlite 数据库中的特定行中 基本思想是数据库存储如下条目 id day time 1 Monday 09 00 2 Monday 11 00 3 Tuesday 10 00 ID
  • Amazon CloudSearch 从 DynamoDB 创建 Null ID

    我正在尝试开始使用 Amazon CloudSearch 我的数据位于我想要搜索的 DynamoDB 表中 我能够设置云搜索域 它从表中提取字段并让我设置它们 等等 但是 我上传数据时遇到了一些问题 我告诉它要从中提取 DynamoDB 表
  • 结果值在 '? :' 表达式的类型 '()' 和 'Bool' 不匹配[重复]

    这个问题在这里已经有答案了 我有一个双精度数组和一个按钮 按下该按钮会清空数组 我希望仅当数组的计数大于零时才启用该按钮 代码如下 var numbers Double At some point I add some numbers he
  • KnockoutJS 的购物车逻辑(?)问题

    The Goal 制作动态产品列表 场景 我有一个包含产品的购物应用程序 当我点击add button的产品 我想在侧边栏中显示我添加的产品 问题总结 您只需阅读此内容 我的代码中有以下代码ProductsSummary Index csh
  • 开始后跟冒号和变量是什么意思?

    什么是data mux意思是这里 它只是块的名称吗 if PORT CONFIG 32 P0 1 b1 begin data mux end 这些是块名称 它们特别适用于generate块 例如 您可以定义一个generate块如 genv
  • user.status 始终返回“离线”

    我知道user status应该用于返回用户状态 但它总是返回离线状态 无论我或其他参与者更改状态 代码 app commands command name user description f async def user self in
  • std::function 的开销

    我见过很多人们建议不要使用的例子std function lt gt 因为它是一个重量级的机制 有人可以解释一下为什么会这样吗 std function是一个类型擦除类 它采用任何它的构造材料 并删除除以下内容之外的所有内容 使用有问题的签
  • Prettytensor:尝试使用未初始化的值

    我正在关注这些教程 教程4中介绍了prettytensor 按照教程 我编写了这段代码来运行一个小型神经网络 import tensorflow as tf Use PrettyTensor to simplify Neural Netwo
  • 使用控制台应用程序调用非静态类

    我正在尝试使用控制台应用程序调用另一个类的方法 我尝试调用的类不是静态的 class Program static void Main string args Program p new Program var myString p Non
  • 如何使用具有多个同名值的 RouteValues

    在我的 ASP NET MVC 4 应用程序中 我可以过滤多个标签 在 HTML 中 它看起来像这样
  • 没有名为“后端”的模块

    我正在做这个简单的 django 教程http www madewithtea com simple todo api with django and oauth2 html http www madewithtea com simple
  • 标签地址 (MSVC)

    我们正在为高级编译语言编写字节码 经过一些分析和优化后 很明显 当前最大的性能开销是我们用来跳转到字节码情况的 switch 语句 我们研究了提取每个 case 标签的地址并将其存储在字节码流本身中 而不是我们通常打开的指令 ID 如果这样
  • 在 eclipse 中运行 jms 示例时,资源注入不起作用。

    我想在 eclipse 中运行 jms 教程文件 我已正确配置 glassfish 并添加了 jms 资源 如果我在 netbeans 中运行它 它工作正常 我在 eclipse 中创建了一个 应用程序客户端项目 这是资源注入的地方 Res
  • AFNetworking (AFHttpClient) 离线模式不适用于 NSURLRequestReturnCacheDataDontLoad 策略

    我在我的应用程序中使用 AFNetworking 并尝试通过使用缓存数据 如果可用 使其在离线模式下工作 我预计在将请求缓存策略设置为 NSURLRequestReturnCacheDataDontLoad 后 getPath parame
  • Java线程生产者消费者算法无法正常工作

    我正在尝试学习线程 因此我编写了一个示例生产者消费者问题 其中生产者生成从 1 到 10 的数字 而消费者必须显示它们 但只有消费者显示数字 1 并停止 正如我所说 该程序写得不好 可能很荒谬 但我仍然想弄清楚为什么从 1 到 10 的所有