【发布时间】:2014-05-16 04:11:24
【问题描述】:
以下代码复制自http://www.programcreek.com/2009/02/notify-and-wait-example/
我见过很多使用while循环来包装wait()的例子
我的问题: 在我第一次尝试解决类似问题时,我使用了 if 语句来包装 wait()。例如,
if(messages.size() == MAXQUEUE) {
wait();
}
用while循环代替if语句有什么好处?
import java.util.Vector;
class Producer extends Thread {
static final int MAXQUEUE = 5;
private Vector messages = new Vector();
@Override
public void run() {
try {
while (true) {
putMessage();
//sleep(5000);
}
} catch (InterruptedException e) {
}
}
private synchronized void putMessage() throws InterruptedException {
while (messages.size() == MAXQUEUE) {
wait();
}
messages.addElement(new java.util.Date().toString());
System.out.println("put message");
notify();
//Later, when the necessary event happens, the thread that is running it calls notify() from a block synchronized on the same object.
}
// Called by Consumer
public synchronized String getMessage() throws InterruptedException {
notify();
while (messages.size() == 0) {
wait();//By executing wait() from a synchronized block, a thread gives up its hold on the lock and goes to sleep.
}
String message = (String) messages.firstElement();
messages.removeElement(message);
return message;
}
}
class Consumer extends Thread {
Producer producer;
Consumer(Producer p) {
producer = p;
}
@Override
public void run() {
try {
while (true) {
String message = producer.getMessage();
System.out.println("Got message: " + message);
//sleep(200);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
Producer producer = new Producer();
producer.start();
new Consumer(producer).start();
}
}
【问题讨论】:
-
你知道
if和while语句的区别吗? -
令我惊讶的是,在重复问题的所有答案中,只有一个(我刚刚投票赞成)提到了虚假唤醒。这个问题的正确答案是“虚假唤醒”。
-
是的,我知道其中的区别。我假设如果锁不可用, wait() 将停止当前线程。我的问题可以这样表述:如果线程停止,为什么要使用 while 循环,而不是 if 语句。
标签: java multithreading wait synchronized