2013-08-29 4 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는 통신하려는 동기화 객체 (일명 잠금)를 알지 못합니다.

관련 문제