CodeGym /Java Course /모듈 2: 자바 코어 /wait, notify 및 notifyAll 메소드 소개

wait, notify 및 notifyAll 메소드 소개

모듈 2: 자바 코어
레벨 9 , 레슨 2
사용 가능

"안녕, 아미고!"

"안녕, 리시!"

"Object 클래스의 wait , notifynotifyAll 메소드를 소개하겠습니다 ."

"오늘 우리는 그들과 친해질 것입니다. 하지만 나중에 돌아와서 이것에 더 많은 시간을 할애할 것입니다."

"좋아요."

"이러한 방법은 스레드 동기화 메커니즘의 일부로 발명되었습니다."

"Java에는 다른 스레드에서 공유 리소스(개체)에 대한 액세스를 제어하기 위한 기본 제공 메커니즘이 있음을 상기시켜 드리겠습니다. 스레드는 개체가 사용 중임을 선언할 수 있으며 다른 스레드는 사용 중인 개체가 해제될 때까지 기다려야 합니다. "

"기억나네요. 동기화된 키워드를 사용해서 그렇게 하세요 ."

"맞습니다. 일반적으로 코드는 다음과 같습니다."

public void print()
{
 Object monitor = getMonitor();
 synchronized(monitor)
 {
  System.out.println("text");
 }
}

"어떻게 작동하는지 기억해?"

"예. 두 스레드가 동시에 print() 메서드를 호출하면 그 중 하나가 synchronized라고 표시된 블록에 진입하고 모니터를 잠그므로 두 번째 스레드가 모니터가 해제될 때까지 기다리게 됩니다."

"맞습니다. 스레드가 동기화됨이라는 라벨이 붙은 블록에 들어가면 모니터 개체는 사용 중인 것으로 표시되고 다른 스레드는 모니터 개체가 해제될 때까지 강제로 대기하게 됩니다. 동일한 모니터 개체를 프로그램의 여러 부분에서 사용할 수 있습니다. "

"그나저나 이름 모니터를 선택한 이유는 무엇입니까?"

"모니터는 일반적으로 사용 중 또는 비어 있는 상태를 저장하는 개체라고 합니다."

"그리고 이것은 대기알림 방법이 작동하는 곳입니다."

"사실, 이것들은 정말 유일한 두 가지 방법입니다. 나머지는 이러한 방법의 적응일 뿐입니다."

"이제 대기 방법이 무엇이고 왜 필요한지 머리를 감아봅시다 . "

"때때로 프로그램에서 스레드가 동기화된 코드 블록에 들어가 모니터를 잠그지만 일부 데이터가 누락되어 계속 진행할 수 없는 상황이 있습니다. 예를 들어 처리해야 하는 파일의 다운로드가 완료되지 않았거나 그런 것."

"파일이 다운로드될 때까지 기다릴 수 있습니다. 루프를 사용하여 확인할 수 있습니다. 파일이 아직 다운로드되지 않은 경우 1초 정도 잠자고 다운로드될 때까지 다시 확인하십시오."

"이 같은:"

while(!file.isDownloaded())
{
 Thread.sleep(1000);
}
processFile(file);

"하지만 우리의 경우 이러한 유형의 대기는 비용이 너무 많이 듭니다. 우리 스레드가 모니터를 잠갔기 때문에 다른 스레드도 필요한 데이터를 이미 가지고 있더라도 강제로 기다려야 합니다."

" wait() 메서드는 이 문제를 해결하기 위해 발명되었습니다. 이 메서드는 스레드가 모니터를 해제한 다음 스레드를 «일시 중단»합니다.

"모니터가 사용 중일 때만(즉, 동기화된 블록 내부에서만) 모니터 개체의 대기 메서드를 호출할 수 있습니다. 이 경우 스레드가 일시적으로 실행을 중지하고 다른 스레드가 사용할 수 있도록 모니터가 해제됩니다."

"스레드가 동기화된 블록에 들어가 대기를 호출하여 모니터를 해제하는 경우가 종종 있습니다 ."

"그러면 두 번째 스레드가 들어와 일시 중단되고 세 번째 스레드 등이 계속됩니다."

"그런데 스레드는 어떻게 재개되나요?"

"이를 위해 두 번째 방법이 있습니다. 알림입니다."

"모니터 가 사용 중일 때만(즉, 동기화된 블록 내부에서만) 모니터 개체의 notify / notifyAll 메서드를 호출할 수 있습니다 . notifyAll 메서드는 이 모니터 개체를 기다리고 있는 모든 스레드를 깨웁니다."

" notify 메소드는 하나의 임의 스레드를 '고정 해제'하지만, notifyAll 메소드는 이 모니터의 모든 «고정» 스레드를 고정 해제합니다."

"매우 흥미롭군. 고마워, 리시."

"wait() 메서드의 적응도 있습니다."

wait() 메서드 설명
void wait(long timeout)
스레드는 «동결»되지만 메소드에 인수로 전달된 밀리초 수를 기다린 후 자동으로 «동결 해제»됩니다.
void wait(long timeout, int nanos)
스레드는 "정지"되지만 인수로 메서드에 전달된 나노초 수를 기다린 후 자동으로 "정지 해제"됩니다.

"우리는 이것을 타임아웃이 있는 대기라고 부릅니다. 이 방법은 일반적인 대기처럼 작동하지만 지정된 시간이 지나고 스레드가 깨어나지 않은 경우 스스로 깨어납니다."

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION