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

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

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

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

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

正如@Tudor(和其他人)所提到的,你不能在你没有synchronized的对象上调用wait() ,因此你会得到IllegalMonitorStateException 。 线程不会受到影响。

 Thread t1 = new MyThread(); // this will throw t1.wait(); 

你最有可能应该调用t1.join() 。 这等待线程完成后再继续。 但是,您尚未启动Thread t1因此连接将永远等待。 如果线程已经启动,那么当Thread.run()方法完成时(由于它返回或抛出exception), 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); 

哪个线程会睡觉? 目前的一个“明显”。

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

添加到目前为止尚未说过的内容:实际上,当您在线程对象上调用wait时,“exception”的内容将会或者至少会发生。

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

没有Thread#wait方法。 waitinheritance自Object并用于同步。 因此,除非您先synchronized(t1) ,否则您将获得非法的监视器exception。

t1.wait 不会等待完成 t1.wait 。 它等待另一个线程对线程对象的锁定。