Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.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 调用wait函数后,如何确定哪个线程将等待?_Java_Multithreading - Fatal编程技术网

Java 调用wait函数后,如何确定哪个线程将等待?

Java 调用wait函数后,如何确定哪个线程将等待?,java,multithreading,Java,Multithreading,在Java多线程中,可以对任何对象调用wait方法。我们如何知道哪个对象将等待 例如: 我创建了一个线程,并在该线程的run方法中声明了obj.wait(),其中obj是该线程类中使用的某个对象。当我们从main方法调用thread.start方法时,哪个线程将等待 在另一个场景中,如果我从main调用wait,比如t.wait(),其中t是线程方法实例,那么哪个线程将wait(),而不是在线程的run方法中调用wait 第一种和第二种情况相同吗 或者,如果我从main调用obj.wait(),

在Java多线程中,可以对任何对象调用wait方法。我们如何知道哪个对象将等待

例如:

  • 我创建了一个线程,并在该线程的run方法中声明了obj.wait(),其中obj是该线程类中使用的某个对象。当我们从main方法调用thread.start方法时,哪个线程将等待

  • 在另一个场景中,如果我从main调用wait,比如t.wait(),其中t是线程方法实例,那么哪个线程将wait(),而不是在线程的run方法中调用wait

  • 第一种和第二种情况相同吗

  • 或者,如果我从main调用obj.wait(),而不是从main调用t.wait(),其中obj是main方法中的某个对象,那么哪个线程将等待

  • 有人能解释一下这个概念吗,因为有n种可能的方法可以从不同的上下文和不同的对象上调用wait?

    调用obj.wait()的线程就是等待的线程

    …如果我从main调用它,比如t.wait()

    调用
    t.wait()
    的威胁是等待的线程。对象的类型并不重要。不管对象是线程还是任何其他类型的对象。调用
    wait()
    的线程就是等待的线程

    有人能解释一下这个概念吗

    Java教程在这方面做得相当好:


    更好:不要急于使用
    wait()
    notify()
    。它们是低级原语,旨在以非常特定的方式(如教程所示)用于构建高级同步对象。但是Java库和第三方库已经为您所需要的大多数同步对象提供了高质量的实现


    如果你的目标是解决某个特定的问题,那么不要浪费时间重新发明轮子。OTOH,如果你的目标是学习车轮是如何制造的,那么这是一件很好的事情

    调用
    obj.wait()
    的线程就是等待的线程

    …如果我从main调用它,比如t.wait()

    调用
    t.wait()
    的威胁是等待的线程。对象的类型并不重要。不管对象是线程还是任何其他类型的对象。调用
    wait()
    的线程就是等待的线程

    有人能解释一下这个概念吗

    Java教程在这方面做得相当好:


    更好:不要急于使用
    wait()
    notify()
    。它们是低级原语,旨在以非常特定的方式(如教程所示)用于构建高级同步对象。但是Java库和第三方库已经为您所需要的大多数同步对象提供了高质量的实现


    如果你的目标是解决某个特定的问题,那么不要浪费时间重新发明轮子。OTOH,如果你的目标是学习车轮是如何制造的,那么这是一件很好的事情

    调用
    obj.wait()
    时,挂起的总是当前线程(即,运行调用
    obj.wait()
    的方法的线程)。只有当另一个线程在
    obj
    上同步,然后调用
    object.notify()
    object.notifyAll()
    ,最后退出
    obj
    上的同步块,从而释放其监视器上的锁时,才会*恢复

    当第一个线程恢复时,它将首先重新获取
    obj
    上的锁。(您只能在
    obj
    上进行同步时调用
    obj.wait()
    ,否则它将被调用。该锁在线程等待时被释放,并在线程唤醒前重新获取。)

    对线程实例调用
    wait()
    不是专门处理的,您不应该使用它,因为线程已经在使用它了。
    特别是,
    t.wait()
    不会导致该线程等待,而是导致当前线程等待,直到其他线程在该线程对象上同步并调用
    notify()
    notifyAll()
    上,如上所述。问题是线程使用这些方法是为了自己的目的,例如。通过在线程实例上调用这些方法,您将有效地试图在其自身的消息传递上大喊大叫,这可能会导致问题。正如Thread的文档所述:

    建议应用程序不要在线程实例上使用wait、notify或notifyAll



    *线程也可以自行唤醒,这称为伪唤醒;但这是非常罕见的,尽管你应该对此进行辩护,但你永远不应该认为它会发生。特别是,由于您可能调用了
    wait()
    来挂起线程,直到满足某个条件(另一个线程设置了一些变量等),因此您应该始终将
    wait()
    调用包围在一个循环中,以检查该条件是否已满足。

    当您调用
    obj.wait()
    时,它始终是当前线程(也就是说,正在运行调用已挂起的
    obj.wait()
    )方法的线程。只有当另一个线程在
    obj
    上同步,然后调用
    object.notify()
    object.notifyAll()时,它才会*恢复
    ,最后退出
    obj
    上的同步块,从而释放监视器上的锁

    当第一个线程恢复时,它将首先在
    obj
    上重新获取锁(您只能在
    obj
    上进行同步时调用
    obj.wait()
    ,否则它将被释放。该锁在线程等待时被释放,并在线程唤醒之前重新获取。)

    对线程实例调用
    wait()
    不是专门处理的,您不应该使用它,