Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Wait_Scjp - Fatal编程技术网

Java 理解等待()

Java 理解等待(),java,multithreading,wait,scjp,Java,Multithreading,Wait,Scjp,我创建了这个愚蠢的程序来玩wait() 在我的机器上,代码永远无法打印3,除非我写入wait(100)或其他毫秒数。为什么会这样?您只有一个线程。wait()正在等待另一个线程的通知。因为没有其他线程通知您正在等待的对象的监视器,所以它只是在那里阻塞。由于您正在同步并等待一个局部变量,几乎没有任何其他线程能够对它调用notify()。您在notifyAll()之前执行wait()。wait()将被阻止。当您输入超时值时,wait()将超时,然后您的程序将继续。如果希望程序正常工作,请创建一个线程

我创建了这个愚蠢的程序来玩
wait()


在我的机器上,代码永远无法打印3,除非我写入
wait(100)
或其他毫秒数。为什么会这样?

您只有一个线程。wait()正在等待另一个线程的通知。

因为没有其他线程通知您正在等待的对象的监视器,所以它只是在那里阻塞。由于您正在同步并等待一个局部变量,几乎没有任何其他线程能够对它调用
notify()

您在notifyAll()之前执行wait()。wait()将被阻止。当您输入超时值时,wait()将超时,然后您的程序将继续。如果希望程序正常工作,请创建一个线程并在那里执行notifyAll()。wait()和notifyAll是为线程间同步而设计的。

wait
notifyAll
是为多线程而设计的
args.wait()
将永远等待直到其他线程调用
args.notifyAll()
args.notify()

当您调用
args.wait(100)
时,它将等待100ms,超时并继续

如果您熟悉信号量,那基本上就是wait/notify

调用wait时,线程 释放锁并挂起 执行。在将来的某个时候, 另一个线程将获得相同的结果 锁定并调用Object.notifyAll, 通知所有等待该线程的线程 锁上重要的东西 发生了:


Java教程是一个很好的学习资源。

在提出另一个问题之前,您是否可以尝试至少阅读半小时有关某个概念的内容?这是一个非常有趣的建议,谢谢。你帮了大忙。我帮了大忙,给了你一个答案。作为回报,你应该认真对待我的评论;)谢谢,这节省了我的时间(并为其他人提供了学习内容)。干得好,伙计。
public class WaitTest {
    public static void main(String [] args) {

      System.out.print("1 ");
      synchronized(args){

        System.out.print("2 ");

        try {
          args.wait();
          args.notifyAll();
        }
        catch(InterruptedException e){ System.out.print("exception caught");}

        System.out.print("3 ");
      }
   }
}