2013-03-30 2 views
-1

스윙은 스레드로부터 안전하지 않으므로 EDT라고하는 한 번에 하나의 스레드에서만 실행할 수 있습니다.스윙의 제한

스윙 형 액센트 및 시각적 멀티 스레딩을 허용하는 구성 요소 (즉, EDT에서만 실행하도록 제한되지 않음)를 사용하려면 어떻게해야합니까?

+2

난 당신이 한계를 오해 생각합니다. 이것들은 Swing의 제약이 아니라 GUI 라이브러리입니다. 결론 : 모든 GUI 라이브러리에서 백그라운드 스레드를 사용해야합니다. 나는 당신에게이 똑같은 문제가없는 것을 보여 주라고 도전한다. –

+0

그러나 여러 가지 "시각적 인"동작 이상이 동시에 발생하는 프로그램이 만들어졌습니다. GUI를 사용하여 가능해야합니다 ... 스레드로부터 안전하지 않은데도 프로그래머가 할 수없는 이유는 무엇입니까? 제대로 라이브러리를 사용하여 스레드 안전 프로그램을 만드시겠습니까? – Karlovsky120

+0

시각적 동작은 백그라운드 스레드에서 발생하는 코드에 의해 구동 된 다음 스레드로부터 안전한 방식으로 GUI를 업데이트합니다. 그리고 프로그래머는 스레드 안전성을 존중하여 스레드 안전 프로그램을 만들 수 있습니다. 나는 이것이 문제가 아닌 것으로 생각한다. –

답변

3

스윙을 사용하십시오. 응용 프로그램을 하나의 스레드에서 실행하지 않고 GUI 만 변경하면됩니다.

그것은 실행 여러 스레드를 가지고 있고, 그들 각각이 같은 일을해야하는 것은 매우 흔한 일 :

EventQueue.invokeLater(new Runnable() { 
    public void run() { 
     someFrame.setVisible(true); 
     myCustomTableModel.updateWithNewData(newListOfData); 
    } 
}); 
+0

하지만 다른 스레드에서 동일한 스윙 구성 요소 (객체)를 동시에 액세스하고 변경할 수 있습니까? 그리고 동시에 여러 개의 EDT를 실행하는 것에 대해 말하고 있습니다 ... – Karlovsky120

+0

예, 동시성에 대한 걱정없이 원하는만큼 많은 스레드에서 안전하게 EventQueue.invokeLater를 호출 할 수 있습니다. 시스템은 다중 이벤트 디스패치 스레드를 결코 가질 수 없지만 원하는만큼 많은 응용 프로그램 스레드를 작성할 수 있습니다. EventQueue.invokeLater는 Runnable 인수를 이벤트 발송 스레드의 실행으로 병합하여 처리합니다. – VGR