2013-08-29 22 views
1

运行将从主要方法开始,如果在某些方法中我使用this.wait()而没有同步块,它将抛出illegalStateMonitorException。为什么我们需要对象监视是否只有线程

如果只有一个线程为什么不能等待,为什么我们应该在这里使用锁定。线程也不会执行任何其他任务。它可能在那里等着。

我不明白为什么需要锁定,如果有单线程。

public class waitSleepCheck extends Thread{ 

    public void method() throws InterruptedException ,IllegalMonitorStateException{ 

     this.wait(1000); 

    } 

    public static void main(String args[]) throws InterruptedException{ 
     waitSleepCheck object = new waitSleepCheck(); 
     object.method(); 
    } 

} 
+2

在旁注中,请遵循Java命名约定 – sanbhat

+3

因为JVM不知道系统中可能运行了多少个线程,或者它们何时可能启动...... – MadProgrammer

+2

您是否希望线程进入睡眠状态?因为[Thread.sleep](http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#sleep(long))会这样做。 – user2357112

回答

5

Object.wait不是“等这么久”。这是“等待其他线程去做一些事情”。采取参数的形式是“等待其他线程去做某事,但过了很久就会觉得无聊并停下来”。您需要保持对象的锁定,以确保与线程正确同步,以便通知您正在等待的事情已完成。在单线程上下文中使用该方法没有意义。

如果你只是想等待一定的时间,Thread.sleep是你想要的方法。

+4

我被downvoted了?我错了什么? – user2357112

+0

严格来说,它不是“等待其他线程去做某件事”。它是“等待其他线程通知/通知我”。它是否有(或没有)做的是特定于应用程序的。 –

0

synch(lockObj) {Object.wait()}表示您等到另一个线程发出信号(请参阅Object.notify())。在底层系统中,这些方法被翻译为wait(lockObj);pulseevent(target);哪个句柄你认为JVM会向他们展示?如果你没有指定锁对象,那么java不知道你想要通过哪个同步对象(aka锁)。

相关问题