중화사전망 - 서예자전 - 자바 스윙 멀티 스레드 교착 상태 분석
자바 스윙 멀티 스레드 교착 상태 분석
프로그램이 교착 상태에 빠지면 가능한 한 빨리 원인을 찾아 해결하고 싶을 것이다. 이 시점에서 일반적인 정력은 교착 상태를 일으키는 위치를 찾는 데 사용되고, 나머지 절반은 스택을 추적하여 교착 상태의 원인을 파악하는 데 사용됩니다. 그러나 Java Swing 프로그램에서 모든 노력은 가치가 없을 수 있습니다. Java 는 Swing 멀티 스레드 프로그래밍에 대한 특수한 요구 사항을 가지고 있습니다. 즉, GUI 구성 요소는 Swing 과 동일한 스레드에서만 수정할 수 있습니다.
즉, jLabel setText(blabla) 와 같은 코드를 실행하려면 다른 스레드가 아닌 Swing 스레드에 있어야 합니다. 다른 스레드의 구성 요소를 수정해야 하는 경우 유사한 방법으로 해결할 수 있습니다.
Swing utilities invoke later (new runnable () {
공용 void 실행 () {
Jlabel settext (blabla);
}
}
InvokeLater 메서드는 시간 지연이라는 의미가 있는 것처럼 보이지만 실제로는 거의 효과가 없으며 몇 밀리 초 이내에 실행될 수 있습니다. 또 다른 invokeAndWait 방법이 있는데, 특별히 필요하지 않은 한 거의 필요하지 않습니다.
InvokeLater 를 사용하지 않고 새로 고침 문제를 일으키는 것은 이해할 수 있지만 교착 상태의 장점은 믿을 수 없다. 다행히도, 우리는 언제든지 change 메서드를 호출할 필요가 없다. 이는 대부분의 경우 Swing 과 동일한 스레드 (예: 버튼 클릭 이벤트를 수신하는 ActionListener actionPerformed 메서드) 에서 인터페이스를 업데이트하기 때문입니다. Swing 과 동일한 스레드에서 실행되지만 콜백 클래스에서 다른 클래스를 참조하고 AWT/Swing 에 속하지 않는 경우 결과를 확인하기 어려우므로 invokeLater 를 사용하는 것이 가장 안전해야 합니다.
Invoke later 에서 수행하는 모든 작업으로 인해 Swing 스레드 창 그리기가 중단되고 Invoke later 작업이 완료될 때까지 기다리므로 Invoke later 에서 시간이 많이 걸리는 작업을 하지 말고 가능한 인터페이스 그리기와 관련된 작업만 수행합니다. 코드 재구성을 통해 인터페이스 업데이트와 관련된 코드를 중앙 집중식으로 통합 처리할 수 있습니다.
Lishi Xinzhi/article/program/Java/gj/201311/27498