Wait()/notify()同步 [英] Wait() / notify() synchronization
问题描述
我正在尝试检查等待/通知在Java中的工作方式.
I'm trying to check how wait/notify works in java.
代码:
public class Tester {
public static void main(String[] args) {
MyRunnable r = new MyRunnable();
Thread t = new Thread(r);
t.start();
synchronized (t) {
try {
System.out.println("wating for t to complete");
t.wait();
System.out.println("wait over");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class MyRunnable implements Runnable {
public void run() {
System.out.println("entering run method");
synchronized (this) {
System.out.println("entering syncronised block");
notify();
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("leaving syncronized block");
}
System.out.println("leaving run method");
}
}
返回的输出
wating for t to complete
entering run method
entering syncronised block
//sleep called
leaving syncronized block
leaving run method
wait over
我期望执行notify()时,等待将结束& System.out.println("wait over");
将被打印.但是看来它只有在t
完成其run()
时才被打印.
I was expecting when notify() is executed the wait will be over & System.out.println("wait over");
will get printed. But it seems it only gets printed when t
finished its run()
.
推荐答案
对象监视器锁需要对同一锁进行单个引用...
Object monitor locks need to be performed a single reference of the same lock...
在您的示例中,您是waiting
在Thread
的实例上,但使用的是Runnable
中的notify
.相反,您应该使用一个通用的锁定对象...例如
In your example you are waiting
on an instance of the Thread
, but using notify
from the Runnable
. Instead, you should use a single, common lock object...for example
public class Tester {
public static final Object LOCK = new Object();
public static void main(String[] args) {
MyRunnable r = new MyRunnable();
Thread t = new Thread(r);
t.start();
synchronized (LOCK) {
try {
System.out.println("wating for t to complete");
LOCK.wait();
System.out.println("wait over");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static class MyRunnable implements Runnable {
public void run() {
System.out.println("entering run method");
synchronized (LOCK) {
System.out.println("entering syncronised block");
LOCK.notify();
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("leaving syncronized block");
}
System.out.println("leaving run method");
}
}
}
输出...
wating for t to complete
entering run method
entering syncronised block
leaving syncronized block
wait over
leaving run method
wait over
和leaving run method
可能会根据线程调度而改变位置.
wait over
and leaving run method
could change positions depending on the thread scheduling.
您可以尝试将睡眠放在synchronized
块旁边.这将释放监视器锁定,从而允许wait
部分继续运行(因为直到释放锁定后它才能启动)
You could try putting the sleep out side the synchronized
block. This will release the monitor lock allowing the wait
section to continue running (as it can't start until the lock is released)
public static class MyRunnable implements Runnable {
public void run() {
System.out.println("entering run method");
synchronized (LOCK) {
System.out.println("entering syncronised block");
LOCK.notify();
System.out.println("leaving syncronized block");
}
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("leaving run method");
}
}
这篇关于Wait()/notify()同步的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!