1

내 프로그램에는 동시에 4 개의 스레드 인 addElemets가 jlist의 모델에 있습니다. 이렇게하면 너무 많은 업데이트 또는 다시 칠하기 때문에 jlist가 깜박 거리거나 excpetions를 던지거나 충돌 할 수 있습니다.4 개의 스레드가 하나의 jlist에 추가됩니다.

나는 내 문제를 해결하는 약간의 지연을 두려고했지만, 나는 많은 귀중한 시간을 잃고 있었다.

어떻게해야합니까?

new Thread(new Runnable() { 
    @Override 
    public void run() { 
     for(int i=0; i<4; i++){ 
      new Thread(new Runnable() { 
       @Override 
       public void run() { 
        for(int o=0; o<2000; o++){ 
         model.addElement("add"); 
         try { 
          Thread.sleep(100); 
         } catch (InterruptedException ex) { 
          Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex); 
         } 
        } 
       } 
      }).start(); 
     } 
    } 
}).start(); 
+1

더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –

+2

스윙 GUI 객체는 [이벤트 발송 스레드] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)에서 _only_ 작성 및 조작해야합니다. – trashgod

+0

모델은 어떻게 보이나요? addElement 메소드는 무엇을합니까? addElement 메소드가 실행될 때마다 프로그램을 다시 칠하도록 강요하면 분명히 깜박 거립니다 :-) –

답변

2

model.addElement 스레드되지 않습니다

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     listModel.addElement("add"); 
    } 
}); 

이렇게하면 요소가 임의의 스레드가 아닌 EDT 아래에 추가됩니다.

1

GUI 조작은 이벤트 발송 스레드에서 수행해야합니다

이 코드는 내 문제를 시뮬레이션합니다. 많은 스레드를 생성 했더라도 비 GUI 작업을 수행하십시오. GUI 측면을 조작하기 위해 actionCommand (또는 비슷한 것)를 실행하십시오.

당신은 자바 문서 도구에서이 경고를 여러 번 읽어 얻을 것이다 : 스윙 구성 요소 ("추가") 안전

1

너무 많은 리프레시/다시 그리기를 피하려면 배경 스레드에서 모델 업데이트를 수행하고 이전에 노출 된 기법으로 EDT의 스윙 모델에 한 번 복사해야합니다. DefaultListModel을 사용하지 말고 addAll()을 처리하는 사용자 정의를 제안합니다.

관련 문제