生产者 - 消费者计划中的线程优先级 - wait()&通知()

时间:2016-06-08 06:59:33

标签: java multithreading producer-consumer

下面我已经包含了Producer-Consumer程序(来自Java - 完整参考指南第9版),这可能是许多人的线程间通信的熟悉示例。

     $('.modal-body').html('<b>Order Number</b>: '+order.order_id +
 '<br>'+'<b>Order Date:</b>' + ' ' +order.created_date+ '<br>'+'<b>Table Number:</b>' + ' ' +order.uid + '<br>'+'<b>Status:</b> ' + ' ' +order.status+ '<br>'+'<b>Title:</b>' + ' ' +order.title + '<br>'+'<b>Quantity:</b>' + ' ' +order.quantity+ '<br>'+'<b>Personalization:</b>' + ' ' +order.personalization);

我想澄清一下为什么Producer永远不会在没有Consumer返回的情况下修改 n 两次。特别是在 get 中, notify(); 行在 return n; 之前。 (当然,该方法必须以返回线结束。)

但是,在 get 中,为什么操作系统不能在 notify()行之后和 return n

2 个答案:

答案 0 :(得分:3)

  

但是为什么Producer线程到达this.n = n是不可想象的。在Consumer线程执行下一个返回n之前;说,单核心系统?

因为,两个方法都是synchronized,并且一次只能有一个线程执行它们。

对于您的方案,如果CPU在调用notify()之后和返回n之前放弃了消费者线程;由于synchronized关键字,生产者仍将等待获取锁定。在调用notify之后,生产者已经可以运行,但在消费者仍然与消费者保持联系之前不会运行。

答案 1 :(得分:0)

当一个线程在一个synchronized方法中时,在同一个实例上尝试调用它(或任何其他同步方法)的所有其他线程都必须等待。 [参考:完整参考:Java ]

这里,如果Consumer线程在get()方法内部,那么Producer线程必须在调用put()方法之前等待,直到Consumer完成执行get()方法,因为两个方法都是同步并且呼吁同一个实例q