중화사전망 - 서예자전 - 자바 스윙 멀티 스레드 교착 상태 분석

자바 스윙 멀티 스레드 교착 상태 분석

Java Swing 을 기반으로 그래픽 인터페이스를 개발할 때 Swing 멀티 스레드 문제가 발생하는 경우가 많습니다. 우리는 그것에 대해 생각할 수 있습니다. 그래픽 인터페이스에 대량의 데이터를 표시해야 하는 경우, 이 데이터는 길고 복잡한 조회와 조작 후에 얻은 것이다. 그래픽 인터페이스의 동일한 스레드에서 쿼리 및 작업을 수행하면 인터페이스가 일정 기간 동안 비활성 상태가 되어 사용자에게 좋지 않은 상호 작용 느낌을 줄 수 있습니다. 이 문제를 해결하기 위해 일반적으로 별도의 스레드를 시작하여 운영 및 쿼리를 수행하고 언제든지 그래픽 인터페이스를 업데이트합니다. 이때 또 다른 문제가 발생했는데, 이는 원래의 가끔 충돌 문제를 해결하지 못할 뿐만 아니라 프로그램의 완전한 사망을 초래할 수도 있다. 다행히도 JDK 에는 인터럽트 프로그램의 바로 가기가 숨겨져 있습니다. 바로 CTRL+BREAK 입니다. Sun 은 문서에 게시하지 않았습니다. Java 가 명령줄 모드에서 시작된 경우 프로그램은 CTRL+BREAK 를 눌러 스택의 추적 정보를 얻습니다. 여기서 충돌을 일으키는 특정 위치를 알 수 있습니다.

프로그램이 교착 상태에 빠지면 가능한 한 빨리 원인을 찾아 해결하고 싶을 것이다. 이 시점에서 일반적인 정력은 교착 상태를 일으키는 위치를 찾는 데 사용되고, 나머지 절반은 스택을 추적하여 교착 상태의 원인을 파악하는 데 사용됩니다. 그러나 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