如果我们在Thread类的实例上调用wait()方法会发生什么。
Thread t1 = new MyThread();
t1.wait();
我的主题是什么状态t1?
答案 0 :(得分:7)
与您致电wait()
之前的情况相同。 wait()
是java.lang.Object
的一种方法。它等待与对象关联的内在监视器。在这种情况下,对象是一个线程,并不会改变wait()的作用。但是,将Thread对象用作监视器是非常奇怪的。您应该使用私有和最终对象作为监视器。
答案 1 :(得分: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();
将返回。
{{1}}
答案 2 :(得分:2)
不会发生任何异常情况。您将暂停当前线程,直到其他线程调用t1.notify
。您只是将t1
用作普通监视器。
顺便说一句,您的代码将抛出IllegalMonitorStateException
,因为您在同步块之外调用wait
。
事实上,我发现java的方法选择有点烦人,特别是关于线程类。
以这种情况为例:
Thread t = new Thread();
t.start();
t.sleep(1000);
哪个线程会睡觉?目前的“明显”。
答案 3 :(得分:1)
它仍然是你正在调用的java.lang.Object的wait,所以只有当前线程会等待(假设你持有对象监视器,否则会抛出IllegalMonitorStateException)。
答案 4 :(得分:1)
添加到目前为止尚未说过的内容:实际上,当您在线程对象上调用wait时,“异常”的内容将会或者至少会发生。
这是因为Thread
内部在this
内部等待,显然这导致有趣的结果至少可以说。
答案 5 :(得分:0)
没有Thread#wait
方法。 wait
继承自Object
,用于同步。因此,除非您先synchronized(t1)
,否则您将获得非法的监视器异常。
t1.wait
将不等待线程完成。它等待另一个线程对线程对象的锁定。
答案 6 :(得分:0)
请参考java.lang.Thread#join(long)中的Java文档:
此实现使用this.isAlive为条件的this.wait调用循环。当线程终止时,将调用this.notifyAll方法。建议应用程序不要在线程实例上使用wait,notify或notifyAll。
如果对线程实例使用wait,则线程终止时将调用this.notifyAll方法。您将获得难以调试的混乱行为。