在没有扩展Thread或实现Runnable的对象上调用wait()时会发生什么?

时间:2015-04-29 01:07:36

标签: java multithreading

在未扩展Thread或实现Runnable的对象上调用wait()时会发生什么?

这是一个如此简单的问题,但当我被某人问到时,我有好的但不是确切的答案。任何确切的答案?

5 个答案:

答案 0 :(得分:1)

java docs对此很清楚。它就像名称所暗示的那样,导致当前线程等待,直到在对象上调用notify或notifyall(由另一个线程)。这些方法用于在需要访问相同关键资源并需要互斥的线程之间协调。深入讨论here

如果将Thread用作锁定对象,则仅在Thread对象上调用wait和notify才有意义,这在我的经验中是不寻常的。

答案 1 :(得分:0)

它仍然有效。您只是在正在运行的主线程上调用wait。

根据Javadocs

  

void wait()   导致当前线程等待,直到另一个线程调用此对象的notify()方法或notifyAll()方法。

他们不在线程类中的原因是为所有对象提供并发控制的可用性。您可能希望对象与另一个线程进行通信

答案 2 :(得分:0)

wait将在一个线程上工作,与任何其他对象有一点区别 - 当一个线程终止时,在这个线程上调用notifyAll方法,wait将突然终止。不建议使用Thread作为锁

答案 3 :(得分:0)

它会工作。当前线程(主)将等到提到的值。

例如,检查以下程序:

FETCH_HEAD

输出: 将等待10秒 等待----->将在10秒后打印

答案 4 :(得分:-2)

行。所以我自己冒昧地跑去看看。 如果在任何不在Syncronized上下文中的对象上调用wait()将抛出IllegalMonitorStateException。

public class HelloWorld{

  public static void main(String []args){
      try{

         String str = new String();
         str.wait();
     }catch(InterruptedException e){
         System.out.println(e);
     }catch(IllegalMonitorStateException e){
         System.out.println(e);
     }
    System.out.println("Hello World");
 }
}

输出:java.lang.IllegalMonitorStateException
Hello World