자바 wait notify 예제

여기서 는 대기(), notify() 및 notifyAll()과 같은 모든 저수준 API가 잘 작동하는 전통적인 방법이지만, 더 높은 수준의 메커니즘은 Java의 기본 잠금 및 조건과 같이 더 간단하고 더 나은 경우가 많다는 점을 언급할 가치가 있습니다. 인터페이스(java.util.concurrent.locks 패키지에서 사용 가능). 예, 이 예제를 시도할 수 있으며 잠시 동안 잠글 수 있습니다. b.wait()를 호출하기 전에 ThreadB가 실행을 완료했는지 여부를 확인하는 검사가 있어야 합니다. 예를 들어 메시지 큐를 보고 있는 스레드 그룹(특정 유형의 메시지만 처리하는 스레드 그룹)이 있습니다. 큐에 메시지를 배치하면 생산자는 모든 소비자 스레드에 알릴 수 있습니다. 그런 다음 각 소비자 스레드는 메시지가 있는지 확인할 수 있으며 메시지가 처리되면 다시 기다릴 수 있습니다. wait() 메서드호출은 스레드가 대기 중인 조건을 확인하는 루프에 있어야 합니다. 이는 가짜 웨이크업으로 알려진 시나리오를 피하기 위해 java 문서에 따라 권장 됩니다. notify() 단일 임의 스레드를 해제하기 때문에 스레드가 유사한 작업을 수행하는 상호 배타적 잠금을 구현하는 데 사용할 수 있지만 대부분의 경우 notifyAll()을 구현하는 것이 더 실행 가능합니다. 생산자 소비자 문제를 해결하는 가장 간단한 방법은 이 자습서에서 설명한 대로 차단 큐를 사용하는 것이지만 생산자 소비자 패턴의 핵심 개념을 실제로 이해하려면 대기 및 알림 메서드를 사용하여 이 문제를 해결해야 합니다.

Java. 당신이 어려운 방법을 해결할 때, 당신은 더 많은 것을 배울 수 있습니다. 이 튜토리얼에서는 Java에서 wait() notifyall() 의 목적을 논의하고 있습니다. 우리는 대기와 통지의 차이를 이해할 것이다. 또한 이 메서드 호출은 현재 스레드가 개체의 모니터(본질 잠금)의 소유자가 아닌 경우 IllegalMonitorStateException을 throw합니다. 이것이 위의 예제에서 동기화된 블록을 사용한 이유입니다. 동일한 개체에서 wait()라고 하는 단일 스레드를 해제합니다. notify() 호출이 실제로 리소스에 대한 잠금을 포기하지는 않는다는 점에 유의해야 합니다. 대기 스레드에 해당 스레드가 절전 모드 해제될 수 있음을 알려줍니다. 그러나 통보자의 동기화된 블록이 완료될 때까지 잠금은 실제로 포기되지 않습니다. 다음은 간단한 프로그램입니다 :-) 클래스 고객{ int 금액 = 10000; 동기화 된 무효 인출 (int 금액){ System.out.println (“철회 할 것…”); if(이 금액<금액){ System.out.println("잔액 감소; 보증금을 기다리는 중…"); 시도{대기 ();} catch(예외 e){} } 이.금액-=금액; System.out.println("철회 완료…"); } 동기화 된 무효 예금 (int 금액){ System.out.println ("입금 예정…"); 이 금액+=금액; System.out.println("입금 완료…

“); 알림(); } } 클래스 Test{ 공용 정적 보이드 메인(String args[]){{최종 고객 c=새 고객(); 새 스레드({public void run(15000);} }. 시작(); 새 스레드(){ 공용 보이드 실행(){c.deposit(10000);} }. 시작(); }} 출력: 철회 하려고… 적은 균형; 보증금을 기다리는 중… 입금하려고… 보증금 완료… 완료된 폴링은 일반적으로 특정 조건이 사실인지 여부를 확인하기 위해 루프의 도움으로 구현됩니다. true이면 특정 작업이 수행됩니다. 이렇게 하면 많은 CPU 주기가 낭비되고 구현이 비효율적입니다. 예를 들어 한 스레드가 데이터를 생성하고 다른 스레드가 데이터를 사용하는 고전적인 대기열 문제에서 데이터를 사용합니다. 첫째, wait() 또는 notify()에 대한 호출이 동일한 개체에서 동기화되는 호출(wait() 및 notify() 호출과 함께 코드의 동기화된 영역 내에 있는지 확인해야 합니다. 이에 대한 이유(표준 나사 안전 문제 제외)는 누락된 신호로 인해 인해 문제가 되기 때문입니다.

예제 1 : 개체가 다른 유형의 개체 (다른 클래스 또는 사용자 정의 된 개체)인 경우 잘 작동합니다. 그러나 이 예제에서는 스레드가 사용되므로 스레드가 실행될 때 말할 수 없습니다. 대기 함수는 스레드가 시스템 속도에 따라 달라지기 전이나 후에 실행될 수 있습니다.