0

如果我们在 Thread 类的实例上调用 wait() 方法会发生什么。

Thread t1 = new MyThread();
t1.wait();

我的线程 t1 的状态是什么?

4

7 回答 7

7

这将与您致电 之前相同wait()wait()是一种方法java.lang.Object。它等待与对象关联的内在监视器。在这种情况下,对象是一个线程,这不会改变 wait() 的作用。但是,将 Thread 对象用作监视器是非常奇怪的。您应该使用私有和最终对象作为监视器。

于 2012-05-17T16:37:19.643 回答
3

正如@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();
于 2012-05-17T16:43:38.147 回答
2

不会发生任何不寻常的事情。您将暂停当前线程,直到其他线程调用t1.notify。您只是将t1其用作普通显示器。

顺便说一句,您的代码会抛出一个,IllegalMonitorStateException因为您wait在同步块之外调用。

事实上,我发现 java 的方法选择有点烦人,尤其是关于线程类。

以这种情况为例:

Thread t = new Thread();
t.start();
t.sleep(1000);

哪个线程会休眠?当前的“显然”。

于 2012-05-17T16:35:30.523 回答
1

补充一些迄今为止尚未提及的内容:实际上,当您在线程对象上调用 wait 时,会或至少会发生“不寻常的”事情。

那是因为Thread内部在内部等待,this至少可以说这显然会导致有趣的结果。

于 2012-05-17T16:59:48.573 回答
1

它仍然是您调用的 java.lang.Object 的等待,因此只有当前线程会等待(假设您持有对象监视器,否则将抛出 IllegalMonitorStateException)。

于 2012-05-17T16:36:34.203 回答
1

请参考 java.lang.Thread#join(long) 中的 java doc:</p>

此实现使用以 this.isAlive 为条件的 this.wait 调用循环。当线程终止时,将调用 this.notifyAll 方法。建议应用程序不要在 Thread 实例上使用 wait、notify 或 notifyAll。

如果您在 Thread 实例上使用 wait ,则当线程终止时,将调用 this.notifyAll 方法。你会得到难以调试的令人困惑的行为。

于 2019-07-25T11:33:09.587 回答
0

没有Thread#wait方法。wait继承自Object并用于同步。所以除非你有synchronized(t1)第一个,否则你只会得到一个非法的监视器异常。

t1.wait不会等待线程完成。它等待另一个线程在线程对象上加锁。

于 2012-05-17T16:37:40.203 回答