2013-09-30 2 views
0

GUI 응용 프로그램에서 스레드 사용에 대한 질문이 있습니다. (단순한 예로) 일련의 이미지가있는 스윙 응용 프로그램이 있다고 가정 해보십시오. 나는 부모의 이미지를 가져 오는 두 개의 스레드를 가지고있다. (따라서 주어진 수의 학생들에게는 각 서버 종점에서 어머니 이미지와 아버지 이미지를 얻으십시오). 반환 된 아버지와 어머니의 이미지가 화면의 이미지에 추가되어 여러 명의 학생들이 모친, 아버지, 어머니, 아버지와 일련의 이미지를 갖게됩니다.스윙을 사용한 멀티 스레딩

어떻게 이것을 다중 스레드 환경에서 예약 할 수 있습니까? 어머니 또는 아버지 이미지를 얻으려는 각 호출은 병행되어야하며 화면에 이미지를 표시하지 못하게해야합니다. 각 스레드가 이미지를 반환하면 화면에 표시된 이미지가 새로 고침됩니까? 어떻게 구성 될 것입니까?

+2

SwingWorker 및 ExecutorService 살펴보기 – nachokk

답변

2

Concurrency in Swing으로 시작하십시오.

가장 간단한 방법은 검색하고 목록을 처리하는 데 필요한 항목 목록이있는 SwingWorker을 사용하는 것입니다.

이 문제는 각 요청을 하나씩 만 실행하여 다른 옵션보다 조금 느리게 만드는 것입니다. 이로 인해 UI에 알리거나 이벤트를 안전하게 변경할 수 있도록 Event Dispatching Thread와 다시 동기화 할 수있는 쉬운 기능을 제공한다는 이점이 있습니다.

또 다른 옵션은 Executors, 특히 Thread Pool 구현을 사용할 수 있습니다.

이렇게하면 나중에 어느 정도 시간에 실행해야하는 많은 작업을 제출할 수 있지만 프로세스에서 언제든지 사용할 수있는 스레드 수를 제어 할 수 있습니다.

단점

은 UI를 업데이트 할 때 지금

SwingUtilities.invokeLater를 사용하여 다시 UI 자신의 변경 사항을 동기화에 대한 책임이 될 것입니다. 당신은 둘 다 사용할 수 있습니다.

기본적으로 "어머니"및 "아버지"서버, 원본 이미지 및 가능한 콜백의 관련 정보를 전달할 수있는 일종의 "요청"클래스를 설치해야합니다 인터페이스는 최종 이미지가 렌더링 될 때 알려줍니다.

리퀘 스터는 Runnable 또는 Callable을 작성하여 SwingWorker을 래핑합니다.

실행될 때이 "요청 작업"은 SwingWorker을 시작하여 이미지를 가져 와서 병합하고 결과를 publish으로 콜백 인터페이스에 알립니다. "요청 작업"은 종료하기 전에 SwingWorker#get이 반환 될 때까지 대기합니다.

아이디어로 ...