>当在未扩展 Thread 或实现 Runnable 的对象上调用 wait() 时会发生什么?
这是一个如此简单的问题,但是当我被某人问到时,我有好的答案,但没有确切的答案。有什么确切的答案吗?
java 文档对此非常清楚。 顾名思义,它会导致当前线程等待,直到在对象上调用通知或通知所有(由另一个线程调用)。 这些方法用于在需要访问相同关键资源并需要互斥的线程之间进行协调。 在这里深入讨论。
仅当该线程用作锁定对象时,对 Thread 对象调用等待和通知才有意义,这在我的经验中是不寻常的。
它仍然有效。您只是在正在运行的主线程上调用等待。
根据Javadocs
无效等待() 使当前线程等待,直到另一个线程调用此对象的 notify() 方法或 notifyAll() 方法。
它们不在线程类中的原因是为所有对象提供一些并发控制的可用性。您可能希望您的对象与另一个线程通信
等待将在线程上工作,就像处理任何其他对象一样,但有一个区别 - 当线程终止时,在此线程上调用 notifyAll 方法,等待将突然终止。不建议将线程用作 lock
它会起作用。当前线程(主线程)将等待到上述值。
例如,检查以下程序:
public class Test{
public static void main(String[] args)
{
try{
Test t = new Test();
synchronized (t){
System.out.println("Will wait for 10 secs");
t.wait(10000);
System.out.println("Wait over");
}
}
catch (Exception e){
System.out.println(e);
}
}
}
输出:将等待 10 秒等待----->将在 10 秒后打印
好的。所以我只是冒昧地跑去亲眼看看。如果在任何不在同步上下文中的对象上调用 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
世界您好