INNENTÜREN, TUNING DESIGN TÜREN aus Slowenien.


  • Ljubljana


    0038651 - 660 - 406

  • Ptuj


    0038651 - 316 - 130
    0038631 - 688 - 777

자바 wait notify 예제

자바 wait notify 예제

세 가지 방법을 보여 주는 간단한 Java 프로그램- 이 프로그램은 여러 지점에서 입력을 포함하기 때문에 오프라인 IID에서만 실행될 수 있습니다. notifyAll() 메서드는 웨이터 스레드와 프로그램이 모두 실행 후 완료및 종료됩니다. 즉, 기다려야, 통지 및 통보모든자바에서모든입니다. 공개 동기화 된 무효 예금 (int 금액){ System.out.println (“입금 금액 “+금액); 이.총금액+=금액; System.out.println(“입금 완료… 그리고 지금 총금액은 “+this.totalAmount”입니다. 알림(); } } 블록 내부의 SInce b.wait()는 잠금을 해제하고 기다릴 것이고, 왜 프로그램이 b.start()로 계속되지 않았고 완료되지 않았습니까? 여기서 는 대기(), notify() 및 notifyAll()과 같은 모든 저수준 API가 잘 작동하는 전통적인 방법이지만, 더 높은 수준의 메커니즘은 Java의 기본 잠금 및 조건과 같이 더 간단하고 더 나은 경우가 많다는 점을 언급할 가치가 있습니다. 인터페이스(java.util.concurrent.locks 패키지에서 사용 가능). #1 공용 클래스 DeadLock { 공용 정적 보이드 메인 (String[] args)의 경우 인터럽트 예외 {새 DeadLock());} 개인 동기화 된 보이드 교착 상태() { {wait(예) { {wait(interruptedException ex) { ex.printStackTrace(} } } } } } } } } } } } } } } } } } } 이 예제는 wait()가 호출되기 전에 notify()가 호출되는 경우 작동하지 않습니다. 이 경우 주 스레드가 영원히 대기 / 차단됩니다.

wait()가 b.start() 전에 1번째라고 하는지 확인하려면 wait() 명령을 내립니다. 내가 맞지? 일반적으로 이러한 메서드가 올바르게 사용되는 경우 대부분의 시나리오에서는 이러한 방법이 적용되지 않습니다. 다른 스레드가 대기하지 않을 때 notify() 메서드가 호출되는 경우 notify() 단순히 반환되고 알림이 손실됩니다. 4) 통보()에 주의하십시오. 당신이 무엇을하고 있는지 알 때까지 notifyAll()를 고수하십시오. 이 게시물은 당신에게 당신이 찾고있는 답변을 제공해야합니다 : http://stackoverflow.com/questions/2779484/why-must-wait-always-be-in-synchronized-block 어떤 스레드가 통지 후 호출됩니다 및 notifyAll이 세부 사항은 어디에 예 경우 어디서나 저장됩니다? 위의 프로그램을 호출 할 때, 우리는 출력 아래에 볼 수 있지만 메시지 개체에 대기하는 두 개의 스레드가 있기 때문에 프로그램이 완료되지 않습니다 및 notify() 메서드는 그들 중 하나를 깨우고, 다른 스레드는 여전히 알림을받을 기다리고 있습니다. 1) notify() 정의 : 동일한 개체에서 wait()라고 하는 첫 번째 스레드를 깨우면 보다 효율적인 가드가 Object.wait를 호출하여 현재 스레드를 일시 중단합니다. 다른 스레드가 이 스레드가 대기중인 이벤트가 반드시 발생하지 않을 수 있다는 알림을 다른 스레드가 발행할 때까지 대기 호출이 반환되지 않습니다. 코드의 동기화 된 영역 (wait() 및 notify() 호출이 동일한 개체에서 동기화됨).

이에 대한 이유(표준 나사 안전 문제 제외)는 누락된 신호로 인해 인해 문제가 되기 때문입니다. 이 개체의 모니터에서 대기하는 모든 스레드의 경우(wait() 메서드 중 하나를 사용하여 메서드는 임의로 절전 모드 해제를 알리도록 합니다. 절전 모드 해제할 스레드를 정확히 선택하는 것은 결정적이지 않으며 구현에 따라 다릅니다. notifyAll 메서드는 개체에서 대기 중인 모든 스레드를 절전 모드 해제하지만 먼저 처리할 스레드는 OS 구현에 따라 다릅니다. 이제 질문 : Q.1 나는 동기화가 모두 클래스의 taskQueue (정적 void main() 메서드에서 전달되는)에 있기 때문에 블로그에서 언급 한 출력이 아니라이 출력에 대해서만 기대했습니다.