wait, inform 및 informAll 메소드는 Object 클래스의 최종 기본 메소드입니다. 따라서 이러한 메서드는 하위 클래스에서 재정의될 수 없습니다. Object 클래스는 모든 클래스의 상위 클래스이므로 프로그램에는 wait 및 기타 메서드를 호출하는 다음과 같은 세 가지 형태가 있습니다.
다음과 같이 코드 코드를 복사합니다 .
wait();//방법 1:
this.wait();//방법 2:
super.wait();//방법 3
무효 통지모두()
이 개체에 대해 wait 메서드를 호출하는 모든 스레드의 차단을 해제합니다. 이 메서드는 동기화된 메서드 또는 동기화된 블록 내에서만 호출할 수 있습니다. 현재 스레드가 잠금 보유자가 아닌 경우 이 메소드는 IllegalMonitorStateException을 발생시킵니다.
무효 알림()
차단을 해제하기 위해 개체에 대해 wait 메서드를 호출하는 스레드를 무작위로 선택합니다. 이 메서드는 동기화된 메서드 또는 동기화된 블록 내에서만 호출할 수 있습니다. 현재 스레드가 잠금 보유자가 아닌 경우 이 메소드는 IllegalMonitorStateException을 발생시킵니다.
무효 대기()
통지() 또는 informAll을 통해 다른 스레드에 의해 깨어날 때까지 스레드가 대기 상태에 들어가도록 합니다. 이 메서드는 동기화된 메서드 내에서만 호출할 수 있습니다. 현재 스레드가 잠금 보유자가 아닌 경우 이 메소드는 IllegalMonitorStateException을 발생시킵니다.
void wait(long millis) 및 void wait(long millis,int nanos)
스레드가 알림을 받거나 지정된 시간이 경과할 때까지 대기 상태에 들어가게 합니다. 이러한 메서드는 동기화된 메서드 내에서만 호출할 수 있습니다. 현재 스레드가 잠금 보유자가 아닌 경우 이 메소드는 IllegalMonitorStateException을 발생시킵니다.
Object.wait(), Object.notify() 및 Object.notifyall()은 동기화된 메서드 내부 또는 동기화된 블록 내부에 작성되어야 합니다. 이는 이러한 메서드를 사용하려면 현재 object.wait() 메서드를 실행 중인 스레드가 해당 개체를 소유해야 하기 때문입니다. 개체. 개체 잠금입니다. 현재 컨텍스트 스레드가 객체 잠금을 소유하고 있다는 것을 확실히 알고 있더라도 현재 컨텍스트에서 object.wait()와 같은 문을 작성할 수 없습니다. 좋다:
다음과 같이 코드 코드를 복사합니다 .
패키지 edu.sjtu.erplab.ObjectTest;
클래스 A
{
공개 동기화 무효 printThreadInfo()가 InterruptedException을 발생시킵니다.
{
스레드 t=Thread.currentThread();
System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
}
}
공개 클래스 ObjectWaitTest {
공개 정적 무효 메인(문자열 인수[])
{
Aa=새로운 A();
//printThreadInfo() 메서드에서 InterruptedException이 발생하므로 여기서는 try-catch 블록을 사용해야 합니다.
노력하다 {
a.printThreadInfo();
기다리다();
} 잡기(InterruptedException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
}
}
프로그램을 실행하면 오류가 보고되고 결과는 다음과 같습니다.
스레드ID:1, 스레드이름:메인
스레드 "main" java.lang.IllegalMonitorStateException의 예외
java.lang.Object.wait(네이티브 메소드)에서
java.lang.Object.wait(Object.java:485)에서
edu.sjtu.erplab.ObjectTest.ObjectWaitTest.main(ObjectWaitTest.java:24)에서
올바른 작성 방법은 다음과 같습니다.
다음과 같이 코드 코드를 복사합니다 .
패키지 edu.sjtu.erplab.ObjectTest;
클래스 A
{
공개 동기화 무효 printThreadInfo()가 InterruptedException을 발생시킵니다.
{
스레드 t=Thread.currentThread();
System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
// this.wait(); //계속 기다리세요
this.wait(1000);//1000ms 동안 기다립니다.
// super.wait(1000);
}
}
공개 클래스 ObjectWaitTest {
공개 정적 무효 메인(문자열 인수[])
{
Aa=새로운 A();
//printThreadInfo() 메서드에서 InterruptedException이 발생하므로 여기서는 try-catch 블록을 사용해야 합니다.
노력하다 {
a.printThreadInfo();
//기다리다();
} 잡기(InterruptedException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
스레드 t=Thread.currentThread();
System.out.println("ThreadID:"+t.getId()+", ThreadName:"+t.getName());
}
}