我正在制作一个简单的生产者消费者问题。服务员是生产者,厨师是消费者。我已实现它,以便Chef线程等待,直到Waiter通知它队列中的传入订单。
int
但是,在Waiter线程结束之前,Chef线程不会响应。 任何线索?
答案 0 :(得分:3)
问题是Waiter
永远不会释放共享队列上的锁,因此Chef
永远无法从中读取。
更好的方法是使用BlockingQueue
实施,例如LinkedBlockingQueue
,删除程序中synchronized
块的使用。
对于新应用程序,应避免使用内部锁(synchronized
块),Thread
实例和wait()
/ notify()
调用,而不是使用{{1和} ExecutorService
包中的实用程序。
答案 1 :(得分:1)
尝试移动
System.out.print("Enter item id :");
choice = in.nextInt();
synchronized
部分。
问题出现是因为服务员线程花费大部分时间在in.nextInt()
方法中等待用户输入。锁定一直在获得。当用户输入数字并且锁定被释放时,它几乎立即获得了下一次迭代。调度程序决定哪个线程将在下一个线程尝试获取它时将获得锁定并不完美所以它是唤醒Chef线程但不立即获取锁定。当两个线程试图获得锁定时我们都有这种情况。如果你输入几个数字,你会看到厨师有时间锁定,但并非总是如此。