gpt4 book ai didi

java - 使用多线程的生产者消费者程序

转载 作者:行者123 更新时间:2023-12-02 06:30:53 26 4
gpt4 key购买 nike

我正在尝试使用 java 实现标准的生产者消费者问题。

我做了一些代码来做到这一点。

这是代码:

生产者类别:

class Producer implements Runnable
{

public Producer()
{
new Thread(this,"Producer").start();
}

public synchronized void put()
{
while(Q.valueset)
{
try
{
wait();
}
catch(Exception e)
{
System.out.println(e);
}
}
Q.valueset=true;
Q.i++;
System.out.println("Put:"+Q.i);
notify();
}
public void run()
{
while(true)
{
put();
}
}
}

消费者阶层:

class Consumer implements Runnable
{
public Consumer()
{
new Thread(this,"Consumer").start();
}

public synchronized void get()
{
while(!Q.valueset)
{
try
{
wait();
}
catch(Exception e)
{
System.out.println(e);
}
}
Q.valueset=false;
notify();
System.out.println("Get:"+Q.i);
}

public void run()
{
while(true)
{
get();
}

}
}

静态变量的另一个类:

class Q
{
static boolean valueset=false;
static int i;
}

我还有一个类,它只包含 main 并创建 Producer 和 Consumer 的实例。

现在,当我尝试运行该程序时,它会给出以下输出:

Put:1
put:2
Got:1
Got:2

我对 Wait() 和 notification() 的工作原理以及对象如何从监视器进出有误解。我想澄清这个概念。

这里问题也是由于Wait和notify()而产生的。

我知道这是与多线程相关的非常基本的问题,但这些将帮助我消除我的误解。

我也想了解我的代码中存在什么问题。

我已经浏览了以下链接:

producer - consumer multithreading in Java

最佳答案

您需要对某些共享对象进行wait()notify()。您现在使用同步所做的是等待各自的对象本身,即生产者等待生产者,消费者等待消费者对象。您需要在 Q 中等待一些事情。

来自 Javadoc:

notify(): Wakes up a single thread that is waiting on this object's monitor.

wait(): The current thread must own this object's monitor. The thread releases ownership of this monitor and waits until another thread notifies threads waiting on this object's monitor to wake up either through a call to the notify method or the notifyAll method. The thread then waits until it can re-obtain ownership of the monitor and resumes execution.

此对象的监视器在您的情况下是this,它是您在put()情况下的Producer以及 get() 情况下的 Consumer。但为了让通知通知其他线程,它们需要具有相同的监视器,即它们需要在同一个对象上 wait() 。该对象可以是例如Q 中的一个对象变量。

为了让您开始,我的意思是:

class Q
{
static boolean valueset=false;
static int i;
static Object myLock = new Object();
}

public void put() {
synchronized (Q.myLock) {
while (Q.valueset) {
try {
Q.myLock.wait();
} catch (Exception e) {
System.out.println(e);
}
}
Q.i++; //you forgot this as well
System.out.println("Put:" + Q.i);
Q.valueset = true;
Q.myLock.notify();
}
}

你可以自己填写Consumer类...

Put:1
Get:1
Put:2
Get:2
Put:3
Get:3
Put:4
Get:4

关于java - 使用多线程的生产者消费者程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20064109/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com