2013-12-15 6 views
0

이 메소드를 호출하는 thread가 모두 Swing Timer 또는 SwingUtilities.invokeLater()를 사용하고있는 경우, 일부의 Swing 컴퍼넌트를 갱신하는 임의의 동기 메소드로 데드 록이 발생할 가능성이 있습니다. Swing Timer 작업에서는 invokeLater()를 호출 할 필요가 없다고 생각합니다.스윙 타이머 및 invokeLater를 사용하여 스윙 구성 요소를 업데이트 할 때 교착 상태를 방지하는 방법?

그래서 일부 구성 요소를 업데이트하는 일부 스윙 타이머와 옵저버가 있습니다. 옵저버는 모두 invokeLater()으로 전화하고 스윙 타이머는 임의의 방법 updateComponents()을 직접 호출합니다.

여전히 교착 상태가 발생할 수있는 경우 invokeLater() 교착 상태가 발생하지 않도록 하시겠습니까?

답변

2

스윙 타이머에 의해 트리거 된 동작과 invokeLater에 제출 된 실행 파일은 모두 이벤트 발송 스레드에서 순차적으로 실행되며 invokeAndWait을 포함하지 않는 한 다른 스레드가 작업 완료를 기다리고 있지 않습니다. . 따라서이 사용 패턴만으로 교착 상태가 발생할 수 없습니다. 교착 상태가 발생하면 원인은 EDT와 이벤트 처리와 관련되지 않습니다.

Swing Timer에 제출 된 이벤트 콜백을 포함하여 모든 이벤트 콜백 내에서 invokeLater이 필요하지 않습니다.이 이벤트 콜백은 Event Dispatch Thread에서 이미 호출되도록 보장되어 있기 때문입니다.