如果我们在 Thread 类的实例上调用 wait() 方法会发生什么。
Thread t1 = new MyThread();
t1.wait();
我的线程 t1 的状态是什么?
如果我们在 Thread 类的实例上调用 wait() 方法会发生什么。
Thread t1 = new MyThread();
t1.wait();
我的线程 t1 的状态是什么?
这将与您致电 之前相同wait()
。wait()
是一种方法java.lang.Object
。它等待与对象关联的内在监视器。在这种情况下,对象是一个线程,这不会改变 wait() 的作用。但是,将 Thread 对象用作监视器是非常奇怪的。您应该使用私有和最终对象作为监视器。
正如@Tudor(和其他人)所提到的,你不能调用wait()
一个你不在的对象,synchronized
所以你会得到一个IllegalMonitorStateException
. 线程不会受到影响。
Thread t1 = new MyThread();
// this will throw
t1.wait();
你很可能应该打电话给t1.join()
. 这会等待线程完成,然后再继续。但是,您还没有开始Thread t1
,所以加入将永远等待。如果线程已经启动,那么当Thread.run()
方法完成时(因为它返回或抛出异常),join()
将返回。
Thread t1 = new MyThread();
t1.start();
// this waits for t1 to finish
t1.join();
不会发生任何不寻常的事情。您将暂停当前线程,直到其他线程调用t1.notify
。您只是将t1
其用作普通显示器。
顺便说一句,您的代码会抛出一个,IllegalMonitorStateException
因为您wait
在同步块之外调用。
事实上,我发现 java 的方法选择有点烦人,尤其是关于线程类。
以这种情况为例:
Thread t = new Thread();
t.start();
t.sleep(1000);
哪个线程会休眠?当前的“显然”。
补充一些迄今为止尚未提及的内容:实际上,当您在线程对象上调用 wait 时,会或至少会发生“不寻常的”事情。
那是因为Thread
内部在内部等待,this
至少可以说这显然会导致有趣的结果。
它仍然是您调用的 java.lang.Object 的等待,因此只有当前线程会等待(假设您持有对象监视器,否则将抛出 IllegalMonitorStateException)。
请参考 java.lang.Thread#join(long) 中的 java doc:</p>
此实现使用以 this.isAlive 为条件的 this.wait 调用循环。当线程终止时,将调用 this.notifyAll 方法。建议应用程序不要在 Thread 实例上使用 wait、notify 或 notifyAll。
如果您在 Thread 实例上使用 wait ,则当线程终止时,将调用 this.notifyAll 方法。你会得到难以调试的令人困惑的行为。
没有Thread#wait
方法。wait
继承自Object
并用于同步。所以除非你有synchronized(t1)
第一个,否则你只会得到一个非法的监视器异常。
t1.wait
不会等待线程完成。它等待另一个线程在线程对象上加锁。