Java 由同一对象同步的等待通知无效
我制作此示例是为了了解Wait Notify的工作原理:Java 由同一对象同步的等待通知无效,java,multithreading,concurrency,wait,notify,Java,Multithreading,Concurrency,Wait,Notify,我制作此示例是为了了解Wait Notify的工作原理: public class WaitingTest implements Runnable { Thread b = new Thread(); int total; public static void main(String[] args){ WaitingTest w = new WaitingTest(); } public WaitingTest(){
public class WaitingTest implements Runnable {
Thread b = new Thread();
int total;
public static void main(String[] args){
WaitingTest w = new WaitingTest();
}
public WaitingTest(){
b.start();
synchronized(b){
try{
System.out.println("Waiting for b to complete...");
b.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("Total is: " + total);
}
}
@Override
public void run(){
synchronized(b){
for(int i=0; i<100 ; i++){
total += i;
System.out.println(total);
}
b.notify();
}
}
}
但是我被困在这里好几个小时了,我不明白为什么它不起作用。我的输出应该大于0,但始终为零……我想知道这是否是因为使用了不同的线程,但我不太确定……我缺少了什么?我想你在理解上有一些严重的漏洞。你已经声明了一个线程 并在构造函数中启动它
b.start();
该线程将立即启动并消亡,因为它没有连接Runnable
碰巧的是,当一个线程死亡时,它会在自身上调用notify,因为您在同一个线程对象上进行了同步,所以等待的线程将被唤醒。你在这里也有比赛。如果线程在主线程到达等待之前结束,您将处于死锁状态
此外,没有理由调用run,这就是为什么total保持为0
任何对象都可以同步,它不必是线程。由于线程具有通知自身的奇怪行为,您可能不应该使用它
你应该通读这两个方面。我认为你在理解上有一些严重的漏洞。你已经声明了一个线程 并在构造函数中启动它
b.start();
该线程将立即启动并消亡,因为它没有连接Runnable
碰巧的是,当一个线程死亡时,它会在自身上调用notify,因为您在同一个线程对象上进行了同步,所以等待的线程将被唤醒。你在这里也有比赛。如果线程在主线程到达等待之前结束,您将处于死锁状态
此外,没有理由调用run,这就是为什么total保持为0
任何对象都可以同步,它不必是线程。由于线程具有通知自身的奇怪行为,您可能不应该使用它
您应该检查线程和。除了您如何安排线程的问题之外,您还不正确地使用了wait/notify notify是无状态的。如果没有线程在等待,则不会收到任何通知。如果您稍后等待,将不会收到通知 等待可能会虚假地醒来。仅仅因为等待并不意味着什么 这意味着您需要将wait/notify与state相关联,事实上,没有它是毫无意义的 比如说
// to notify
synchronized(lock) {
signalled = true;
lock.notify();
}
// to wait
synchronized(lock) {
while(!signalled)
lock.wait();
}
除了如何安排线程的问题之外,您还不正确地使用了wait/notify notify是无状态的。如果没有线程在等待,则不会收到任何通知。如果您稍后等待,将不会收到通知 等待可能会虚假地醒来。仅仅因为等待并不意味着什么 这意味着您需要将wait/notify与state相关联,事实上,没有它是毫无意义的 比如说
// to notify
synchronized(lock) {
signalled = true;
lock.notify();
}
// to wait
synchronized(lock) {
while(!signalled)
lock.wait();
}
Try start the thread=你能告诉我们你认为你的run方法应该在哪里执行吗?Try start the thread=你能告诉我们你认为你的run方法应该在哪里执行吗?run附件来自thread b=new Threadthis;然后-我会看一下教程,thx@Victor不客气。是的,您必须将此实例或另一个Runnable传递给线程构造函数才能使用它;然后-我会看一下教程,thx@Victor不客气。是的,您必须将这个实例或另一个Runnable传递给线程构造函数才能使用它;在同步之后,total的值应该是零,但不知怎么的,它不是。我也在想,如果我调用b.notify;在同步之后,total的值应该是零,但不知为什么它不是。。