gpt4 book ai didi

java - 使用同步的生产者-消费者

转载 作者:行者123 更新时间:2023-12-01 15:58:45 29 4
gpt4 key购买 nike

我编写了代码来实现生产者-消费者问题,它似乎工作正常,不需要同步。这可能吗?

如何测试代码并检查它是否确实正常工作?我如何知道是否会发生死锁?现在,我没有跳出循环(即生产者不断插入,消费者不断在无限循环中消费)。我使用大小为 3 的循环队列(为了简单起见)作为共享资源。

这是我的代码:

import java.util.*;

public class PCImpl implements Runnable
{
Thread t;
QforPC qObj;

public static void main(String[] args)
{
QforPC qObject=new QforPC();

//These create 2 different objects! Each object has it's own thread of execution.
//Synchronization is needed when 2 threads use the same object
new PCImpl("Producer",qObject);
new PCImpl("Consumer",qObject);
}

PCImpl(String name,QforPC qObj)
{
this.qObj=qObj;
t=new Thread(this,name);
t.start();
}

public void run()
{
if(Thread.currentThread().getName().equals("Producer"))
{
while(true)
{
Random rgen=new Random();
int n=rgen.nextInt(100);
if(n!=0)
qObj.Producer(n);
try
{
Thread.sleep(200);
}
catch(InterruptedException e)
{

}
}

}


if(Thread.currentThread().getName().equals("Consumer"))
{
while(true)
{
try
{
Thread.sleep(1500);
}
catch(InterruptedException e)
{
}
qObj.Consumer();

}
}

}
}



public class QforPC
{
int[] q={0,0,0};
int r=0,f=0;
public void Producer(int item)
{

if(r!=q.length && canProducer())
{
q[r]=item;
System.out.println("The item inserted into the queue is:"+ item);
r++;
}
if(r==q.length && f>0)
r=0;
else if(r==q.length && f==q.length)
{
r=0;
f=0;
}
}

public void Consumer()
{
int item;
System.out.println("The value of isQueue empty is:"+ isEmpty());

if(f!=q.length && isEmpty()==false)
{
System.out.println("Entered the consumer method");
item=q[f];
System.out.println("The item fetched from the queue is:"+item);
q[f]=0;
f++;
}
if(f==q.length && r<f)
f=0;

}

public boolean isEmpty()
{
for(int k=0;k<q.length;k++)
{
if(q[k]==0 && k==q.length-1)
return true;

}
return false;
}

public boolean canProducer()
{
for(int k=0;k<q.length;k++)
{
if(q[k]==0)
return true;

}
return false;
}
}

最佳答案

您尝试做的是使用忙等待实现同步。在伪代码中,您基本上要做的是:

Producer()
{
if (buffer.hasemptyspaces())
{
produce(buffer);
}
else
{
sleep(n);
}
}

Consumer()
{
if (buffer.hasfullspaces())
{
consume(buffer);
}
else
{
sleep(n);
}
}

您的代码将正常工作,直到生产者和消费者同时尝试执行 Produce() 和 Consumer()。换句话说,其中任何一种可能不会经常发生,但绝对有可能并且一定会发生!

在Java中,ConcurrentLinkedQueue为共享缓冲区实现了无等待算法。如果您环顾四周,我确信还有其他实现。

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

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