这是家庭作业的 生产环境 者消费者模式的实现 . 以下实现有什么问题 . 我已经google了各种实现,但我无法理解我的错误 .
我有一个共享队列,我在同一个锁上同步 生产环境 者和消费者
履行
Shared Queue:
class SharedQueue{
public static Queue<Integer> queue = new LinkedList<Integer>();
}
Producer Thread :
//The producer thread
class Producer implements Runnable{
public void run()
{
synchronized (SharedQueue.queue)
{
if(SharedQueue.queue.size() >=5)
{
try {
SharedQueue.queue.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Random r = new Random();
int x = r.nextInt(10);
System.out.println("Inside Producer" + x);
SharedQueue.queue.offer(x);
SharedQueue.queue.notify();
}
}
}
Consumer Thread:
class Consumer implements Runnable{
public void run()
{
synchronized (SharedQueue.queue)
{
if(SharedQueue.queue.size() == 0)
{
try {
SharedQueue.queue.wait();
} catch (InterruptedException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
int k = SharedQueue.queue.remove();
System.out.println("Inside consumer" + k);
}
}
}
The Main program
public class ProducerConsumerTest {
public static void main(String[] args)
{
Thread p = new Thread(new Producer());
Thread q = new Thread(new Consumer());
p.start();
q.start();
}
}
4 回答
尝试更换:
有:
还有这个:
有:
只需在调用
notify()
后重新检查条件 .我假设您希望这是 生产环境 者消费者的无限循环 . 在Eng.Fouad更改之上,将两个同步块替换为:
并在Consumer中添加通知
实现 生产环境 者消费者问题的简单方法是使用信号量 .
您可以使用ConcurrentLinkedQueue来管理Producer和Consumer的共享队列 . 您可以使用ConcurrentHashMap> collection,它将帮助Producer同时生成,并且Consumer可以同时使用并将生成的密钥保存在另一个集合对象中,其中Consumer可以找到它的密钥并从ConcurrentHashMap>中使用它 .