2012-03-13 3 views
-1

스레드를 사용하는 Java 응용 프로그램이 있습니다. 내 스레드는 매 20 초마다 실행되지만 UI를 차단하는 종류의 UI를 실행하면 ... i. 이자형. 스레드가 실행 중이고 사용자가 UI에있는 버튼을 클릭 할 때마다 가끔씩 응답하지 않습니다.다중 스레드 및 UI 동작

누구나이 문제에 대한 해결책을 말해 줄 수 있습니까?

+3

백그라운드 스레드와 UI가 작동하는 방식을 보여주기 위해 몇 가지 코드 샘플을 제공해야합니다. – Gray

+0

UI 스레드는 기본적으로 UI의 레이블을 업데이트하며 UI에는 5 개의 버튼이 있습니다. – koool

+0

배경 스레드가이 레이블을 어떻게 업데이트합니까? 백그라운드 스레드와 UI 스레드간에 데이터가 어떻게 공유됩니까? 그렇지 않으면 우리가 추측하고있는 몇 가지 코드를 보여주십시오. – Gray

답변

3

java 스윙에서 UI 상태에 대한 변경은 EDT (이벤트 디스패처 스레드)라고하는 기존의 단일 스레드에서 수행해야합니다.

그렇지 않은 경우 일반적으로 이상한 글리치/얼기가 발생합니다. 가장 일반적인 증상 중 하나는 UI의 일부가 회색이된다는 점입니다 (Java 1.6 이후는 UI가 여전히 이전과 같이 그려지지만 반응이 없음).

SwingUtilities.invokeLater(Runnable toRunInEDT); 

노트는 invokeLater를 호출하는 경우, 실행 가능한 실행되는이 결국 현재 대기중인 이벤트 :

갈 수있는 좋은 방법은 EDT의 UI에 변경 내용을 대기열에 전용 방법을 사용하는 것입니다 파견되었습니다. 즉, 코드의 다음 줄은 전에 실행될 수 있습니다. 실행 파일의 코드. 동기 버전 (동부 서머 타임에서 실행되지해야하는)뿐만 아니라이 : edralzar 말한 위에

SwingUtilities.invokeAndWait(Runnable toRunInEDT); 
+0

+1 많은 것을 설명해 주셔서 고마워요. – koool

+2

JButton의 ActionListener와 같은 스윙 리스너 내부의 코드는 ** EDT 내에서 실행됩니다 ** –

2

20 초마다 실행되는 참조하는 스레드와 비슷한 소리가 UI를 제어하는 ​​스레드이기도합니다.

해결책은 두 프로세스를 다른 스레드로 분리하는 것입니다.

+0

+1 감사합니다.많이 – koool

3

몇 가지 추가 팁 :

당신은 할 수 있는지 확인하는 편리한 메소드 SwingUtilities.isEventDispatchThread()을 사용할 수 있습니다 실제로 코드는 이벤트 발송 스레드에서 실행 중입니다. edralzar와 마찬가지로 GUI 구성 요소를 생성하는 모든 코드는 GUI 구성 요소의 상태를 수정하거나 Event Dispatch Thread에서 실행해야하는 GUI 구성 요소의 상태를 읽습니다.

또 다른 고려해야 할 점은 ED30에서 실행되는 코드가 다소 빠르게 실행될 수 있어야한다는 것입니다.. 따라서 이벤트 발송 스레드에서 모든 것을 실행하여 문제를 해결할 수는 없습니다. 다음을 수행하면 GUI가 5 초 동안 고정됩니다.

SwingUtilities.invokeLater(new Runnable(){ 
     public void run(){ 
      try{ 
       Thread.currentThread().sleep(5000); 
      }catch(InterruptedException e){ 
       //Ignored in this example 
      } 
     } 
    }); 

왜 정지됩니까? 모든 GUI 이벤트 및 GUI 갱신은 EDT에서 수행되고 EDT가 5000 밀리 초 동안 휴면 상태 일 때 GUI 갱신이 수행되지 않습니다.

This article 흥미로운 읽을 거리입니다.

+0

아주 좋은 점은 기사가 흥미 롭습니다. 자바 6의 SwingWorker 클래스를 사용하면 마지막 포인트를 처리 할 수있다 (기사에서 언급 한 바와 같이) –