在java中调用Thread实例上的wait()

时间:2012-05-17 16:34:28

标签: java multithreading

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

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

我的主题是什么状态t1?

7 个答案:

答案 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方法。您将获得难以调试的混乱行为。