현재 위치 - 중국 분류 정보 발표 플랫폼 - 비즈니스 서비스 정보 - Java Swing 멀티스레드 교착상태 문제 분석

Java Swing 멀티스레드 교착상태 문제 분석

Java Swing을 기반으로 그래픽 인터페이스를 개발할 때 Swing 멀티스레딩 문제가 자주 발생합니다. 그래픽 인터페이스에 많은 데이터를 표시해야 한다면 이러한 데이터는 길고 복잡해야 합니다. 쿼리와 계산 작업이 그래픽 인터페이스의 동일한 스레드에서 수행되면 인터페이스는 일정 시간 동안 충돌 상태가 되어 이 문제를 해결하기 위해 사용자에게 나쁜 대화식 경험을 제공하게 됩니다. , 계산 및 계산을 위해 별도의 스레드가 시작됩니다. 언제든지 작업을 쿼리하고 그래픽 인터페이스를 업데이트하면 가끔 발생하는 충돌 문제를 해결할 수 없을 뿐만 아니라 프로그램이 발생할 수도 있습니다. 다행히 JDK에는 Ctrl+Break라는 단축키가 숨겨져 있습니다. Sun은 명령줄 모드에서 Java 프로그램을 시작하고 Ctrl+Break를 누르면 다음과 같이 된다고 문서에 발표하지 않았습니다. 스택 추적 정보를 얻을 수 있습니다. 이 추적 정보에서 충돌을 일으킨 특정 위치를 알 수 있습니다.

프로그램 교착 상태가 발생하면 가능한 한 빨리 원인을 찾아 해결하고 싶을 것입니다. 이때 여러분의 에너지는 교착 상태를 일으킨 위치를 찾는 데 소비됩니다. 나머지 절반은 교착 상태를 일으킨 위치를 확인하기 위해 스택을 추적하는 데 사용됩니다. Java Swing 프로그램은 가치가 없을 수 있습니다. 이는 Java가 Swing의 다중 스레드 프로그래밍에 대한 특별한 요구 사항을 갖고 있기 때문입니다. 즉, Swing에서 GUI 구성 요소는 Swing과 동일한 스레드에서만 수정될 수 있습니다.< /p>

즉, jLabel setText(blabla)와 유사한 코드를 실행하려면 Swing 스레드에 있어야 하며 다른 스레드에서 구성 요소를 수정해야 하는 경우 유사한 방법을 사용하여 해결할 수 있습니다. it

SwingUtilities callLater(new Runnable() {

public void run() {

jLabel setText( blabla ); < /p>< p> }

 }

invokeLater 메소드는 시간 지연 실행이라는 의미를 가지고 있지만 실제로는 거의 영향을 미치지 않으며 몇 밀리초 내에 실행될 수 있습니다. InvokeAndWait 메소드도 있는데 특별한 필요가 없으면 거의 사용하지 않습니다.

InvokeLater를 사용하지 않으면 새로 고침 문제가 발생할 수 있다는 점은 이해가 되지만, 다행히 교착 상태를 일으키는 이점은 엄청납니다. 이 메소드는 언제든지 호출할 필요가 없습니다. 이는 대부분의 경우 Swing과 동일한 스레드에서 인터페이스를 업데이트하기 때문입니다. 예를 들어 버튼 클릭 이벤트를 수신하는 ActionListener actionPerformed 메소드는 Swing과 동일한 스레드에서 실행됩니다. 하지만 콜백 클래스에서 다른 클래스를 참조하고 AWT/Swing에 속하지 않는 경우에는 결과를 판단하기 어려우므로 InvokeLater를 사용하는 것이 가장 안전합니다

InvokeLater는 Swing 스레드 창 그리기 작업을 일시 중지하므로, InvokeLater에서 시간이 많이 소요되는 작업을 수행하지 마십시오. 인터페이스 그리기와 관련된 코드만 중앙 집중화할 수 있습니다. 코드 리팩토링을 통한 업데이트 lixixinzhi/Article/program/Java/gj/201311/ 27498