我正在实现逻辑以理解等待和通知工作我发现了一些我无法分析的东西当我用线程扩展类然后等待并且通知正在按预期工作但是当我实现runnable接口然后输出会有所不同
public class AdderThread extends Thread {
int total;
@Override
public void run() {
synchronized (this) {
for (int i = 0; i < 1000; i++) {
total += i;
}
notify();
}
}
public class WaitNotify {
public static void main(String[] args) {
AdderThread addrTh = new AdderThread();
addrTh.start();
// -1243309312
System.out.println("Total without Wait() " + addrTh.total);
}
}
当实现Runnable给我正确的答案意味着它正在等待线程完成任务但是当我使用扩展线程时它给我答案为0即它不等待线程完成任务。
public class WaitNotify {
public static void main(String[] args) {
AdderThread addrTh = new AdderThread();
addrTh.start();
// -1243309312
System.out.println("Total Before Wait " + addrTh.total);
synchronized (addrTh) {
try {
System.out.println("Waiting for Sum...");
addrTh.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Total " + addrTh.total);
}
}
}
答案 0 :(得分:1)
您的新线程可以在主线程调用`wait()之前调用notify()
。在这种情况下,wait()调用将永远等待,因为如果某个其他线程是,则notify()根本不会执行任何操作还没有等待它。
wait()
和notify()
是低级操作,旨在以非常具体的方式使用:
有关详细信息,请参阅Java wait() does not get waked by notify()。
实现Runnable
的情况与扩展Thread
的情况之间的区别是由于this
在第一种情况下引用了匿名内部类,它指的是后一种情况下的Thread
对象。
这很重要,因为线程机器使用wait()和notify()来实现自己的目的。因此,如果您的wait()
来电太迟而无法通过代码中的notify()
调用来唤醒,则可能仍会被库代码中的notify()
唤醒(例如,线程时)终止)。当你实现Runnable
时不会发生这种情况,因为没有理由让库通知它。