java wait 예제

호출 스레드에 잠금을 포기 하 고 다른 스레드가 동일한 모니터에 들어가서 notify()를 호출할 때까지 절전 모드로 이동하도록 호출합니다. wait() 메서드는 대기 하기 전에 잠금을 해제 하 고 wait() 메서드에서 반환 하기 전에 잠금을 다시 수집 합니다. wait() 메서드는 실제로 동기화 메커니즘에서 직접 사용할 수 없는 기능을 사용하여 동기화 잠금과 긴밀하게 통합됩니다. 또한 이 메서드 호출은 현재 스레드가 개체의 모니터(본질 잠금)의 소유자가 아닌 경우 IllegalMonitorStateException을 throw합니다. 이것이 위의 예제에서 동기화된 블록을 사용한 이유입니다. 다중 스레드 프로그래밍에서는 한 스레드가 다른 스레드가 일부 작업을 수행 할 때까지 기다려야하는 것이 일반적입니다. 핑백: 심플 자바 (비)| 진화 유닛 의 진화 유닛 을 웨이터 1 = 새로운 웨이터 (msg); 새 스레드(웨이터1, “웨이터1”).start(); 웨이터 스레드가 {Thread.sleep (3000) 시도를 시작할 수 있도록 허용; } 캐치 (InterruptedException e) { 공개 동기화 된 void withdrwl (int 금액){ System.out.println (“총 금액 “+totalAmount +”와 함께 “+금액”); if(이.totalAmount<금액){ System.out.println("enogh 금액이 아님.). 입금대기중입니다."); 시도{대기 ();} catch(예외 e){} } 이.totalAmount-=금액; System.out.println("Withrawl 성공.. 잔액은 "+총금액"입니다. 간단히 말해서 wait()를 호출할 때 현재 스레드는 다른 스레드 호출이 동일한 개체에 알림() 또는 notifyAll()이 될 때까지 기다려야 합니다. 1) 당신은 옳다. 2) wait() 및 notifyAll()은 생산자와 소비자 모두가 액세스할 수 있는 일부 객체에서 호출되어야 합니다. 따라서 이 목적을 위해 새 모니터 개체를 만드는 대신 이 기존 개체를 사용했습니다.

오류와 관련하여 wait() 및 notify() 호출을 수정한 방법을 확인할 수 없습니다. 수정된 코드를 공유하십시오. 그런 빠른 응답과 내 의심을 지우주셔서 감사합니다. 그리고 내 코드에서 한 일은 “this.notifyAll()”과 “this.wait()”대신 “taskQueue.wait()” 또는 “taskQueue.notifyAll()”이었습니다. 잘 양식 나, 메인 스레드가 시작됩니다, 다음 스레드 b가 시작되고 잠금을 얻을 다음 계산을 완료합니다. 동기화의 두 번째 블록이 시작되고 인쇄 후 “스레드 b가 완료될 때까지 기다리며…”가 시작됩니다. .wait() 메서드를 호출하여 잠금을 해제합니다. 그런 다음 다시 일반 주 스레드가 실행되고 합계가 인쇄됩니다. 그러나 나는 우리가 더 많은 것을 이해할 수 있도록 더 복잡한 예를 원했다.

이것은 매우 간단한 예이며 이 링크에서 많은 http://www.java-samples.com/showtutorial.php?tutorialid=306 정교하게 설명하지 않습니다.wait()는 this.wait()와 같이 작성되지 않습니다. wait() q 개체와 직접 링크를 얻었습니다. 현재 스레드가 해당 개체의 모니터를 소유하지 않는 한 개체에서() 기다릴 수 없습니다.( 그렇지 않으면 IllegalMonitorStateExceptionthrow가 throw됩니다.) 해당 개체의 모니터를 소유하려면 해당 개체에서 동기화해야 합니다. public class ThreadA { 공개 정적 보이드 main(String[] args){ThreadB b =; b.start(); 시도 {Thread.sleep(1000); //시뮬레이션 알림(1000); // 시뮬레이션 알림() } 캐치(InterruptedException e) { 대기() 대기() 통화를 차단하기 때문에 유한한 대기에 대해 이야기하고 있습니다. 그렇기도 하고 그렇지 않기도 하고. 대기 중인 모든 스레드가 절전 모드 해제되지만 개체 잠금을 다시 획득해야 합니다. 따라서 스레드는 병렬로 실행되지 않습니다.

Comments are closed.