在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
方法。 wait
inheritance自Object
并用于同步。 因此,除非您先synchronized(t1)
,否则您将获得非法的监视器exception。
t1.wait
不会等待完成 t1.wait
。 它等待另一个线程对线程对象的锁定。