gpt4 book ai didi

java - 生产者-消费者示例不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 10:33:57 25 4
gpt4 key购买 nike

有人可以帮我修复这个程序吗?我创建了一个生产者类,它使用 Scanner 类请求输入,接下来我创建了一个 Consumer 类,我在其中使用长度和宽度的输入来计算面积。最后,我创建了一个带有 main 方法的类来启动生产者线程和消费者线程。

制作人:-

package Test1;
import java.util.*;
public class Producer extends Thread
{
public int length;
public int width;
Scanner scan=new Scanner(System.in);

public void run()
{
while(true)
{
synchronized(this)
{
length=scan.nextInt();
width=scan.nextInt();
this.notify();
}
}
}

}

消费者:-

package Test1;

public class Consumer extends Thread
{
Producer producer;
Consumer(Producer producer)
{
this.producer=producer;
}
public void run()
{
while(true)
{
synchronized(producer)
{
try
{
System.out.println("Waiting for values from the Producer");
producer.wait();
}
catch(InterruptedException e)
{
e.printStackTrace();
}

int area= calculateArea();
System.out.println("Area is "+area);

}
}
}
public int calculateArea()
{
return producer.length *producer.width;
}
}

主要类(class):-

package Test1;

public class UsingPandC extends Thread {

public static void main(String[] args)
{
Producer producer=new Producer();
Consumer consumer=new Consumer(producer);
producer.start();
consumer.start();

}

}

我期望控制台向我询问输入(确实如此),接下来我期望它通知等待消费者类上释放锁的线程(我认为这不会发生),然后我期望它计算面积并将消费者放回等待状态(这也不会发生并要求更多输入。

最佳答案

synchronize(...) 标记一个临界区,其中只允许一个线程执行该代码块。尽管您通知消费者线程唤醒,但生产者线程几乎立即回收其类的固有锁并请求下一个输入,因为它不必等待任何其他线程,也不必在需要几个 CPU 周期的关键部分之外执行代码。切换线程的上下文可能需要一些时间,因为它并不便宜。这种开销足以使生产者线程可以在循环的下一次迭代中再次进入临界区,从而回收执行其代码的独占权,该代码只是等待用户输入。另一端的消费者线程在被激活后注意到另一个线程(生产者线程)获得了临界区的固有锁,并再次挂起。

如果将生产者中的同步块(synchronized block)限制为仅通知,并从关键部分排除输入处理,那么您的示例应该按预期工作,因为现在生产者需要更多的 CPU 周期才能再次到达同步块(synchronized block),因此允许消费者线程实际获取内在锁并执行其任务。

关于java - 生产者-消费者示例不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49682313/

25 4 0
文章推荐: java - Selenium - 在模式窗口中处理动态数据
文章推荐: java - 如何获得 ojAlgo 矩阵中沿列或行的元素的平均值?
文章推荐: java - 将 ArrayList 对象分配给实例变量 - java
文章推荐: html -
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com