下面,我包括了Producer-Consumer程序(来自Java-《完整参考指南》第九版),它可能是许多人之间线程间通信的一个熟悉示例。
class Q {
int n;
boolean valueSet = false;
synchronized int get() {
while(!valueSet)
try {
wait();
} catch(InterruptedException e) {
System.out.println("InterruptedException caught");
}
valueSet = false;
notify();
return n;
}
synchronized void put(int n) {
while(valueSet)
try {
wait();
} catch(InterruptedException e) {
System.out.println("InterruptedException caught");
}
this.n = n;
valueSet = true;
notify();
}
}
class Producer implements Runnable {
Q q;
Producer(Q q) {
this.q = q;
new Thread(this, "Producer").start();
}
public void run() {
int i = 0;
while(true) {
q.put(i++);
}
}
}
class Consumer implements Runnable {
Q q;
Consumer(Q q) {
this.q = q;
new Thread(this, "Consumer").start();
}
public void run() {
while(true) {
q.get();
}
}
}
class PC {
public static void main(String args[]) {
Q q = new Q();
new Producer(q);
new Consumer(q);
System.out.println("Press Control-C to stop.");
}
}
我想澄清为什么生产者在不返回消费者的情况下永远不能修改n两次。特别是在get里面,notify();。行在返回n之前到达;。(当然,该方法必须以返回行结尾。)
但是,在get内部,为什么操作系统在notify()行之后并返回n之前不能将锁授予Producer ?
但是,为什么生产者线程无法理解这一点呢?在Consumer线程执行下一个返回n之前;行,就说一个核心系统?
因为这两种方法都是,synchronized
并且只有一个线程可以一次执行它们。
对于您的情况,如果CPU在调用之后notify()
和返回之前放弃了使用者线程n
;生产者将由于synchronized
关键字而仍在等待获取锁定。生产者在调用以后已经可以运行,notify
但是直到使用者保持锁定状态才可以运行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句