Swing Worker(스윙 워커)
SwingWorker![]() |
SwingWorker는 Java 프로그래밍 언어의 Swing 라이브러리를 위해 Sun Microsystems가 개발한 인기 유틸리티 클래스입니다.SwingWorker를 사용하면 이벤트 디스패치 스레드를 올바르게 사용할 수 있습니다.Java 6에서는 Swing Worker가 [1]JRE에 포함되어 있습니다.
1998년부터 2006년까지 호환되지 않는 비공식 버전의 SwingWorker가 여러 개 생성되었으며 Java 6 이전 버전에 대한 문서가 풍부하지 않도록 주의해야 합니다.
Java 6.0에서의 사용방법
이벤트 디스패치 스레드 문제
SwingWorker는 사용자 인터랙션이벤트 후에 시간이 걸리는 작업을 수행해야 하는 경우(예를 들어 JButton을 누를 때 큰 XML 파일을 해석하는 경우)에 편리합니다.가장 간단한 방법은 다음과 같습니다.
사적인 문서 문서; ... JButton 단추 = 신규 JButton("열린 XML"); 단추.add Action Listener(신규 액션 리스트너() { @오버라이드 일반의 무효 실행한 액션(액션 이벤트 e) { 문서 = 로드 XML(); } });
이거면 될 것 같은데 아쉽게도loadXML()
메서드는 메인 Swing 스레드(이벤트 디스패치스레드)와 같은 스레드로 호출되기 때문에 메서드가 실행되는 데 시간이 필요할 경우 이 시간 동안 GUI가 정지됩니다.
Swing Worker 솔루션
이 문제는 Java에만 국한된 것이 아니라 많은 GUI 모델에서 공통적으로 발생합니다. SwingWorker
그럼 다른 백그라운드스레드에서 시간이 걸리는 작업을 실행하여 이 시간 동안 GUI의 응답을 유지하는 방법으로 문제를 해결할 수 있습니다.
작업자 생성
다음 코드는 SwingWorker를 정의하고 있습니다.SwingWorker는,loadXML()
메서드 호출:
Swing Worker(스윙 워커) 작업자 = 신규 Swing Worker(스윙 워커)< >문서, 무효>() { @오버라이드 일반의 문서 doInbackground(배경)() { 문서 intDoc = 로드 XML(); 돌아가다 intDoc; } };
작업자 실행
메소드를 사용하여 실행을 시작합니다.
결과 검색 중
결과는 메서드를 사용하여 얻을 수 있습니다.
Event Dispatch Thread를 호출하면 작업이 완료될 때까지 리펜트를 포함한 모든 이벤트가 처리되지 않으므로 긴 작업이 종료되기 전에 콜을 피해야 합니다.작업 완료 후 결과를 가져오려면 다음 두 가지 방법이 있습니다.
- 메서드를 덮어씁니다.이 메서드는 메인이벤트 디스패치스레드에서 호출됩니다.
사적인 문서 문서; ... Swing Worker(스윙 워커)< >문서, 무효> 작업자 = 신규 Swing Worker(스윙 워커)< >문서, 무효>() { @오버라이드 일반의 문서 doInbackground(배경)() { 문서 intDoc = 로드 XML(); 돌아가다 intDoc; } @오버라이드 일반의 무효 다 했어요.() { 해라 { 문서 = 얻다(); } 또 만나 (중단됨예외. ex) { ex.print Stack Trace(프린트 스택 트레이스)(); } 또 만나 (실행예외. ex) { ex.print Stack Trace(프린트 스택 트레이스)(); } } }
- worker 메서드를 사용하여 청취자를 등록합니다.리스너에게 워커 상태의 변경이 통지됩니다.
Complete Worker 예시
사적인 문서 문서; ... JButton 단추 = 신규 JButton("열린 XML"); 단추.add Action Listener(신규 액션 리스트너() { @오버라이드 일반의 무효 실행한 액션(액션 이벤트 e) { Swing Worker(스윙 워커)< >문서, 무효> 작업자 = 신규 Swing Worker(스윙 워커)< >문서, 무효>() { @오버라이드 일반의 문서 doInbackground(배경)() { 문서 intDoc = 로드 XML(); 돌아가다 intDoc; } @오버라이드 일반의 무효 다 했어요.() { 해라 { 문서 = 얻다(); } 또 만나 (중단됨예외. ex) { ex.print Stack Trace(프린트 스택 트레이스)(); } 또 만나 (실행예외. ex) { ex.print Stack Trace(프린트 스택 트레이스)(); } } }; 작업자.실행하다(); } });
이력: Java 6.0 이전 사용 현황
SwingWorker는 Java 6.0 이후 Java SE에만 속해 있습니다.Sun은 이전 JDK에서 사용할 수 있는 버전을 출시했지만 Java SE의 일부가 아니어서 표준 라이브러리 [2]문서에는 언급되지 않았습니다.이러한 최신 버전은 2003년 이후이며 SwingWorker [3]버전3이라고 불리는 경우가 많습니다.유감스럽게도 JDK 6.0 SwingWorker와 버전3 SwingWorker는 다른 메서드명을 사용하여 호환되지 않습니다.Java 6 이전 버전에는 백포트 버전(아래 참조)이 권장됩니다.
SwingWorker 3을 인스턴스화하는 예를 다음에 나타냅니다.
Swing Worker(스윙 워커) 작업자 = 신규 Swing Worker(스윙 워커)() { 일반의 물건 건설하다() { ... //백그라운드 스레드 코드 추가 } 일반의 무효 끝났습니다() { ... //여기에 추가한 코드는 UI 스레드에서 실행됩니다. } }; 작업자.개시하다(); //백그라운드 스레드 시작
그start()
method는 construct() 메서드에 추가된 코드를 별도의 스레드로 실행합니다.백그라운드 스레드가 종료되었을 때 알림을 받으려면 다음 명령을 덮어쓰기만 하면 됩니다.finished()
방법.그construct()
메서드는 나중에 SwingWorker를 사용하여 가져올 수 있는 결과를 반환할 수 있습니다.get()
방법.
Java 6 Swing Worker 백포트
Java 6 SwingWorker에서 Java 5로의 백포트는 [permanent dead link]http://swingworker.java.net/ 에서 구할 수 있습니다.패키지명 이외(org.jdesktop.swingworker
Java 6 Swing Worker 와 호환성이 있습니다.
등가물
System.ComponentModel.BackgroundWorker
- .NET 프레임워크flash.system.Worker
- Adobe Flashandroid.os.AsyncTask
(안드로이드).
「 」를 참조해 주세요.
레퍼런스
- ^
SwingWorker
- ^ 를 참조해 주세요.
javax.swing
J2SE 6.0 이전 및 이후 패키지 요약.또한 버전 6.0: [1], [2]까지는 문서의 인덱스 페이지에 SwingWorker 클래스가 표시되지 않습니다. - ^ 다운로드 할 수 있습니다."SwingWorker 3". Internet Archive. Archived from the original on June 26, 2012.
외부 링크
- Java 7용 SwingWorker 클래스 매뉴얼.
- Oracle의 Java Concurency in Swing 튜토리얼의 Worker Threads 및 SwingWorker.
- 2007년 1월 John O'Conner의 Java SE 6에서 SwingWorker로 애플리케이션 퍼포먼스를 향상시킵니다.