2015-01-07 2 views
5

Java는 한 번에 둘 이상의 EDT를 작성할 수 있습니까?둘 이상의 이벤트 발송 스레드 (EDT)를 설정하는 방법이 있습니까?

EDT를 설정하고 내부에 수백 개의 구성 요소가 포함되어있을 가능성이있는 "강력"패널의 내용을 업데이트하는 방법을 실험하고 있습니다. 현재 내가

 public void run() { 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        panel.update(); 
       } 
      }); 
     } 

나는 다음과 같은 게시물을 검토 한 결과이 : 등

Measuring "busyness" of the event dispatching thread

How does the event dispatch thread work?

Java Event-Dispatching Thread explanation

http://en.wiki2.org/wiki/Event_dispatching_thread

과 .

예를 들어 하나의 EDT가 처리해야하는 12 가지 이벤트가 있다면 자바는 이미 이러한 이벤트를 그룹화/우선 순위 지정하기위한 내부 스케줄링 메커니즘을 가지고 있다는 것을 이해합니다. 내가?

이하 (새의 Runnable() {...} .start()

윌 자바를 새로운 Thread와 2 EDT를 만들 경우 자동으로 병합 무엇 그래서 http://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html

"This is necessary because most Swing object methods are not "thread safe": invoking them from multiple threads risks thread interference or memory consistency errors." 

에 따르면

스레드 안전에 대한 두려움에 다시 1-2 EDTs?

 new Thread(new Runnable() { 
     public void run() { 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        panel.update(); 
       } 
      }); 
     } 
    }).start(); 
+3

두 번째 스레드는 EDT가 아닙니다.) –

+2

EDT를 만들 수 있다고 생각하지 않습니다. 스윙은 자체 EDT를 만듭니다. 원하는만큼 스레드를 생성 할 수 있지만 (최대 한계까지) EDT가 아닙니다. 예제 코드는'Runnable' 객체를 생성하지만, 당신의 스레드에서'panel.update'를 실행하지 않습니다. 대신,이 객체는 Swing에 주어지며, Swing은 그것을 어딘가에 저장하고, 결국 EDT가 그것을 발견하고 실행합니다. – ajb

+0

[Multiple Event Dispatch Threads]의 가능한 복제본 (http : // stackoverflow.com/questions/7323306/multiple-event-dispatch-threads) – Jayan

답변

2

에만있을 수있는 하나의 이벤트 발송 쓰레드!

하지만 왜이 스레드를 하나 이상 갖고 싶습니까? 심지어 많은 구성 요소가있는 "중량이 많은"패널의 경우 (현재 애플리케이션에서 1000 초의 구성 요소가 있어야 함) 한 EDT 만 있으면 충분합니다. EDT에서 많은 CPU 시간을 사용하는 작업을 수행해서는 안됩니다. 그렇지 않으면 업데이트 이벤트에 대한 EDT가 차단되고 사용자 입력에 응답 할 때 GUI가 "느리게"됩니다.

많은 구성 요소가 스레드 저장이 아니므로 모든 GUI 구성 요소는 EDT 내에서만 작성하고 조작해야합니다. 이 가이드 라인을 무시하면 특정 작업에서는 작동하지만 머지 않아 이상한 행동이나 충돌이 발생할 것입니다!

+1

클래스 내에서 패널 및 컴포넌트 작성을 담당 한 계산이 있습니다. 그래서 GUI에서 코어 로직을 다른 클래스로 분리하는 것이 좋습니다. – mk7

+0

정답! 일반적으로 [Model-View-Controller] (http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller) 패턴을보고 싶습니다. 또한 항상 기억해야합니다. EDT에서 GUI 구성 요소의 작성 및 조작이 실행되는지 확인하십시오. 대부분의 경우이 코드는 자동으로 예를 들어 내부에서 코드를 호출 할 때 사용됩니다. (EDT에서 실행되는) ActionListener이지만 GUI 요소에 다른 스레드로 액세스하려는 경우 SwingUtilities.invokeLater 또는 SwingUtilities.invokeAndWait를 사용해야합니다. –

1

스윙 GUI는 단일 스레드입니다. 그 단일 스레드는 EDT입니다. 두 번째 EDT를 도입하고 싶지만 (여전히 GUI가 작동하고 있다면), 스레드 안전성이 추가 된 복잡성을 설명하기 위해 많은 내부 스윙 코드를 다시 작성해야합니다.

다른 EDT를 추가하면 알 수없는 양의 성능 향상 (또는 감소)이 발생합니다.