2011-08-12 6 views
5

나는 AWT EDT에 작업 단위를 보내기 위해 invokeLater()이라는 단순함을 좋아한다. 백그라운드 스레드 (예 : SwingWorker)에 작업 요청을 보내는 것과 비슷한 메커니즘을 사용하는 것이 좋지만 이해할 때 invokeLater()가 의존하는 일종의 이벤트 대기열 처리 대기열이 없습니다 (&).Java에서 "이벤트 중심"백그라운드 스레드를 만들려면 어떻게해야합니까?

그래서 대신 다른 스레드가 메시지를 보내는 블로킹 큐를 배경 스레드에 제공하고 메시지가 도착할 때까지 스레드가 본질적으로 수신 루프를 실행합니다.

실제로, 정확히 어떻게 백그라운드 스레드에서 EDT와 유사한 동작을 구현할 수 있습니까? 다른 한편으로, 나는 하늘에있는 보이지 않는 이벤트 디스패치 큐 (Dispatch Queue)로부터 파견 될 때마다 "작업 물방울 (work droplets)"을 처리하면서 단순히 거기에 매달려있는 스레드의 단순함을 좋아합니다. Java는 이러한 "이벤트 중심 작업자 스레드"를 만드는 방법을 제공합니까? 또는 메시지 대기열로이 작업을 수행하는 올바른 방법일까요? 그리고 관련 맥락에서 메시지를 전달하는 기술은 invokeLater()에 결점이 있습니까?

답변

1

보다 구체적으로는 과 같은 요청을 처리 할 수있는 스레드 풀인 Executor에있는 java.util.concurrent를 살펴보아야합니다. 단일 스레드가 모든 요청을 처리하도록하려면 단일 스레드 (executor = Executors.newSingleThreadExecutor()')로 스레드를 작성하십시오. 또한 작업이 완료되면 값을 반환 할 수있는 ExecutorService도 있습니다.

+0

잘 알고 있지만 "파견"을 제공하지 않는 것 같습니다. – Chap

+0

단일 스레드 실행 프로그램에서 실행 가능 파일을 보내는 것은 EDT에서 실행 파일을 보내는 것과 같습니다. 작업은 처리를 위해 대기열에 올려지고 현재 작업이 없으면 스레드는 대기 상태를 유지합니다. – toto2

+0

@Chap 다른 답변의 설명에서 문제에 대한 설명을 읽었으며 단일 스레드 집행자가 정확히 찾고있는 것 같습니다. – toto2

3

블로킹 큐와 함께 사용하는 Producer-Consumer Design Patter은 다른 종류의 문제를 해결하기위한 다른 접근 방법입니다. EDT는 Worker Design Pattern을 사용합니다. 두 가지 디자인 패턴을 살펴보고 어느 것이 가장 적합한 지 확인하십시오.

  • 일반적으로 Producer-Consumer 패턴은 독립적 인 작업을 개별적으로 실행하는 여러 스레드가있는 경우에 사용됩니다.
  • EDT에서 사용하는 작업자 패턴은 개의 작업을 단일 스레드 (이 경우 GUI 스레드)에 털어 놓기 위해 에 사용됩니다.

물론 단일 대기열과 여러 생성자가있는 단일 소비자가 있지만 디자인 패턴의 유연성을 강조한 경우에도 생산자 - 소비자 패턴을 가져 와서 유사한 동작을 수행 할 수 있습니다. 다시 말하면 디자인 패턴을 선택하는 것은 특정 상황에 가장 적합한 패턴을 기반으로한다는 것입니다. 패턴이 원하는 동작을 수용 할만큼 충분히 유연한 경우 특히 잘못된 선택은 없습니다.

+0

대조 패턴 식별을위한 +1 – Chap

+0

내 상황에서 확실히 작업자 패턴이 필요합니다. 각 작업이 단일 스레드에 의해 순차적으로 처리되어야합니다. 그러나, 당신은 SwingWorker에 링크했습니다 - 나는 그 요점을 놓치고 있을지 모르지만 동시에 여러 개의 SwingWorker 스레드가 생성 될 수는없는 것입니까? 그것은 나를 위해 일하지 않을 것이다. – Chap

+0

'SwingWorker'는 여러 작업을 할 때 GUI가 멈추지 않도록 작업자 디자인 패턴 (wiki 페이지에 묘사 된 것입니다)을 사용합니다. 'SwingWorker'는 작업이 끝나면 다시 호출하기 때문에 GUI에 대한 업데이트는 여전히 GUI 스레드에서 수행됩니다. 귀하의 의견을 바탕으로, 이것은 당신에게 맞는 접근 방식처럼 보이지 않습니다. 작업을 단일 스레드에서 수행해야하는 경우 단일 소비자 (스레드) 및 여러 생산자와 함께 Producer-Consumer 패턴을 사용하여 소비자 만 작업을 실행하십시오. – Kiril

관련 문제