为什么wait()方法没有触发notifyAll()?
Why does the wait() method not trigger notifyAll()?
我是 Java 多线程的新手,编写了一个小程序来测试 wait() 和 notifyAll() 方法如何相互交互。但是为什么这个程序不起作用?
package sample;
public class Main {
public static void main(String[] args) {
new Thread(new MyWriter()).start();
new Thread(new MyReader()).start();
}
}
class MyReader implements Runnable {
@Override
public synchronized void run() {
while(true) {
notifyAll();
}
}
}
class MyWriter implements Runnable {
@Override
public synchronized void run() {
while(true) {
try {
System.out.println("Waiting...");
wait();
System.out.println("Wait Terminated");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
当运行时,我预计输出是
Waiting...
Wait Terminated
但它输出
Waiting...
然后一直等到我手动终止它。
A notify
调用通知在对象监视器上等待的对象。所以,如果你在一个对象上发出 wait
,你必须 notify
使用同一个对象。
一种方法是简单地使用共享对象:
public static void main(String[] args) {
Object lock=new Object();
new Thread(new MyWriter(lock)).start();
new Thread(new MyReader(lock)).start();
}
然后:
public void run() {
while(true) {
synchronized(lock) {
lock.notifyAll();
}
}
public void run() {
while(true) {
try {
synchronized(lock) {
System.out.println("Waiting...");
lock.wait();
System.out.println("Wait Terminated");
}
} ...
}
我是 Java 多线程的新手,编写了一个小程序来测试 wait() 和 notifyAll() 方法如何相互交互。但是为什么这个程序不起作用?
package sample;
public class Main {
public static void main(String[] args) {
new Thread(new MyWriter()).start();
new Thread(new MyReader()).start();
}
}
class MyReader implements Runnable {
@Override
public synchronized void run() {
while(true) {
notifyAll();
}
}
}
class MyWriter implements Runnable {
@Override
public synchronized void run() {
while(true) {
try {
System.out.println("Waiting...");
wait();
System.out.println("Wait Terminated");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
当运行时,我预计输出是
Waiting...
Wait Terminated
但它输出
Waiting...
然后一直等到我手动终止它。
A notify
调用通知在对象监视器上等待的对象。所以,如果你在一个对象上发出 wait
,你必须 notify
使用同一个对象。
一种方法是简单地使用共享对象:
public static void main(String[] args) {
Object lock=new Object();
new Thread(new MyWriter(lock)).start();
new Thread(new MyReader(lock)).start();
}
然后:
public void run() {
while(true) {
synchronized(lock) {
lock.notifyAll();
}
}
public void run() {
while(true) {
try {
synchronized(lock) {
System.out.println("Waiting...");
lock.wait();
System.out.println("Wait Terminated");
}
} ...
}