Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 由同一对象同步的等待通知无效_Java_Multithreading_Concurrency_Wait_Notify - Fatal编程技术网

Java 由同一对象同步的等待通知无效

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(){

我制作此示例是为了了解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(){
        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的值应该是零,但不知为什么它不是。。