JavaTM Platform
Standard Ed. 6

javax.swing
클래스 SwingWorker<T, V>

java.lang.Object 
  상위를 확장 javax.swing.SwingWorker<T, V>
형태 파라미터:
T - 이 SwingWorker 의 doInBackground 메소드 및 get 메소드에 의해 반환되는 결과의 형태
V - 이 SwingWorker 의 publish 메소드 및 process 메소드를 사용해 중간 결과를 계산하는 경우에 사용하는 형태
모든 구현된 인터페이스:
Runnable , Future <T>, RunnableFuture <T>


public abstract class SwingWorker<T, V>
extends Object
implements RunnableFuture <T>

GUI 와 교환하는 시간이 걸리는 태스크를, 전용의 thread로 실행하기 위한 abstract 클래스입니다.

Swing 를 사용해 multi-thread 어플리케이션을 기술하는 경우는, 다음의 2 개의 제약에 주의해 주세요 (자세한 것은「How to Use Threads」를 참조).

이러한 제약이 있기 (위해)때문에, 시간이 걸리는 GUI 어플리케이션에는, 1) 시간이 걸리는 태스크를 실행하는 thread와 2) GUI 관련의 모든 작업을 실행하는 이벤트발송쓰레드 (EDT)가 적어도 2 개의 thread가 필요하게 됩니다. 이와 같이 복수의 thread를 사용하는 경우는 thread간 통신을 실시할 필요가 있습니다만, 이 기능은 간단하게 구현할 수 없는 경우가 있습니다.

SwingWorker 는, 백그라운드 thread로 실행 시간의 긴 태스크를 실행할 필요가 있어, 그 실행중 또는 실행 완료 후에 UI 를 갱신할 필요가 있는 경우를 상정해 설계되고 있습니다. SwingWorker 의 서브 클래스는, 백그라운드에서 계산을 실시하기 (위해)때문에,doInBackground() 메소드를 구현할 필요가 있습니다.

워크플로우

SwingWorker 의 라이프 사이클내에는, 다음의 3 개의 thread가 존재합니다.

현재의 thread가 이벤트발송쓰레드인 경우도 있습니다.

워크스 레드상에서 doInBackground 메소드가 불려 가기 전에,SwingWorker 는 모든 PropertyChangeListeners 에,state 프로퍼티의 값이 StateValue.STARTED 로 변경된 것을 통지합니다. doInBackground 메소드의 실행이 완료하면(자),done 메소드가 실행됩니다. 계속되어,SwingWorker 는 모든 PropertyChangeListeners 에,state 프로퍼티의 값이 StateValue.DONE 으로 변경된 것을 통지합니다.

SwingWorker 는 1 회만 실행되도록(듯이) 설계되고 있습니다. SwingWorker 를 여러 차례 실행해도,doInBackground 메소드는 1 회 밖에 불려 가지 않습니다.

사용예

다음에, 가장 단순한 사용예를 나타냅니다. 일부의 처리는 백그라운드에서 실행됩니다. 실행이 완료하면(자), Swing 컴퍼넌트를 갱신합니다.

여기에서는, 「Meaning of Life」를 검색해, 결과를 JLabel 에 표시합니다.

   final JLabel label;
   class MeaningOfLifeFinder extends SwingWorker<String, Object> {
       @Override
       public String doInBackground() {
           return findTheMeaningOfLife();
       }

       @Override
       protected void done() {
           try {
               label.setText(get());
           } catch (Exception ignore) {
           }
       }
   }

   (new MeaningOfLifeFinder()). execute();
 

다음의 예는, 준비의 완료한 데이터를 이벤트발송쓰레드상에서 처리하는 경우에 사용할 수 있습니다.

여기에서는, 최초의 N 개의 소수를 검색해, 결과를 JTextArea 에 표시합니다. 이것은 계산 처리이므로,JProgressBar 로 진척 상황을 갱신할 필요가 있습니다. 또, 검색된 소수를 System.out 에 출력할 필요가 있습니다.

 class PrimeNumbersTask extends
         SwingWorker<List<Integer>, Integer> {
     PrimeNumbersTask(JTextArea textArea, int numbersToFind) {
         //initialize
     }

     @Override
     public List<Integer> doInBackground() {
         while (!  enough && !  isCancelled()) {
                 number = nextPrimeNumber();
                 publish(number);
                 setProgress(100 * numbers.size() / numbersToFind);
             }
         }
         return numbers;
     }

     @Override
     protected void process(List<Integer> chunks) {
         for (int number : chunks) {
             textArea.append(number + "\n");
         }
     }
 }

 JTextArea textArea = new JTextArea();
 final JProgressBar progressBar = new JProgressBar(0, 100);
 PrimeNumbersTask task = new PrimeNumbersTask(textArea, N);
 task.addPropertyChangeListener(
     new PropertyChangeListener() {
         public  void propertyChange(PropertyChangeEvent evt) {
             if ("progress".equals(evt.getPropertyName())) {
                 progressBar.setValue((Integer) evt.getNewValue());
             }
         }
     });

 task.execute();
 System.out.println(task.get()); //prints all prime numbers we have got
 

SwingWorkerRunnable 를 구현하므로,SwingWorkerExecutor 에 송신해, 실행할 수가 있습니다.

도입된 버젼:
1.6

상자의 클래스의 개요
static class SwingWorker.StateValue
          state 바운드 프로퍼티의 값입니다.
 
생성자 의 개요
SwingWorker ()
          이 SwingWorker 를 구축합니다.
 
메소드의 개요
 void addPropertyChangeListener (PropertyChangeListener  listener)
          PropertyChangeListener 를 청취자 리스트에 추가합니다.
 boolean cancel (boolean mayInterruptIfRunning)
          이 태스크의 실행의 취소를 시도합니다.
protected abstract  T doInBackground ()
          결과를 계산하는지, 계산할 수 없는 경우는 예외를 throw 합니다.
protected  void done ()
          doInBackground 메소드의 실행 완료 후, 이벤트발송쓰레드상에서 실행됩니다.
 void execute ()
          이 메소드는, 워크스 레드에서의 SwingWorker 의 실행 스케줄을 세웁니다.
 void firePropertyChange (String  propertyName, Object  oldValue, Object  newValue)
          모든 등록이 끝난 청취자에게 바운드 프로퍼티이 갱신된 것을 보고합니다.
 T get ()
          필요에 따라서 계산이 완료할 때까지 대기해, 그 후, 계산 결과를 가져옵니다.
 T get (long timeout, TimeUnit  unit)
          필요에 따라서, 최대로 지정된 시간, 계산이 완료할 때까지 대기해, 그 후, 계산 결과가 이용 가능한 경우는 결과를 가져옵니다.
 int getProgress ()
          progress 바운드 프로퍼티을 돌려줍니다.
 PropertyChangeSupport getPropertyChangeSupport ()
          이 SwingWorkerPropertyChangeSupport 를 돌려줍니다.
 SwingWorker.StateValue getState ()
          SwingWorker 상태 바운드 프로퍼티을 돌려줍니다.
 boolean isCancelled ()
          이 태스크가 정상적으로 완료하기 전에 삭제되었을 경우는 true 를 돌려줍니다.
 boolean isDone ()
          이 태스크가 완료했을 경우는 true 를 돌려줍니다.
protected  void process (List <V > chunks)
          이벤트발송쓰레드상에서,publish 메소드로부터 비동기에 데이타체크를 수신합니다.
protected  void publish (V ... chunks)
          process(java.util.List) 메소드에 데이타체크를 송신합니다.
 void removePropertyChangeListener (PropertyChangeListener  listener)
          PropertyChangeListener 를 청취자 리스트로부터 삭제합니다.
 void run ()
          삭제되지 않으면, 이 Future 에 계산 결과를 설정합니다.
protected  void setProgress (int progress)
          progress 바운드 프로퍼티을 설정합니다.
 
클래스 java.lang. Object 로부터 상속된 메소드
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
 

생성자 의 상세

SwingWorker

public SwingWorker()
SwingWorker 를 구축합니다.

메소드의 상세

doInBackground

protected abstract T  doInBackground()
                             throws Exception 
결과를 계산하는지, 계산할 수 없는 경우는 예외를 throw 합니다.

이 메소드는 1 회만 실행됩니다.

주:이 메소드는, 백그라운드 thread로 실행됩니다.

반환값:
계산 결과
예외:
Exception - 결과를 계산할 수 없었던 경우

run

public final void run()
삭제되지 않으면, 이 Future 에 계산 결과를 설정합니다.

정의:
인터페이스 Runnable 내의 run
정의:
인터페이스 RunnableFuture <T > 내의 run
관련 항목:
Thread.run()

publish

protected final void publish(V ... chunks)
process(java.util.List) 메소드에 데이타체크를 송신합니다. 이 메소드는 doInBackground 메소드 내부에서 사용되어 이벤트발송쓰레드상에서의 처리를 위해 process 메소드 내부에서 중간 결과를 전달합니다.

process 메소드는 이벤트발송쓰레드상에서 비동기에 불려 가므로,process 메소드가 실행되기 전에,publish 메소드가 여러 차례 불려 가는 일이 있습니다. 퍼포먼스의 향상을 위해, 이러한 모든 호출은 1 회의 호출에 정리합니다. 각 호출의 인수는 연결됩니다.

다음에 예를 나타냅니다.

 publish("1");
 publish("2", "3");
 publish("4", "5", "6");
 
결과는 다음과 같이 됩니다.
 process("1", "2", "3", "4", "5", "6")
 

사용예. 이 코드 (발췌)는, 테이블 데이터를 로드해, 이 테이블 데이터를 사용해 DefaultTableModel 를 갱신합니다. 이것은 이벤트발송쓰레드상에서 불려 가므로,process 메소드 내부에서 tableModel 가 변경되는 위험성은 없습니다.

 class TableSwingWorker extends 
         SwingWorker<DefaultTableModel, Object[]> {
     private final DefaultTableModel tableModel;
 
     public TableSwingWorker(DefaultTableModel tableModel) {
         this.tableModel = tableModel;
     }
 
     @Override
     protected DefaultTableModel doInBackground() throws Exception {
         for (Object[] row = loadData(); 
                  !  isCancelled() && row ! = null; 
                  row = loadData()) {
             publish((Object[]) row);
         }
         return tableModel;
     }
 
     @Override
     protected void process(List<Object[]> chunks) {
         for (Object[] row : chunks) {
             tableModel.addRow(row);
         }
     }
 }
 

파라미터:
chunks - 처리 대상이 되는 중간 결과
관련 항목:
process(java.util.List)

process

protected void process(List <V > chunks)
이벤트발송쓰레드상에서,publish 메소드로부터 비동기에 데이타체크를 수신합니다.

상세한 것에 대하여는,publish(V...) 메소드를 참조해 주세요.

파라미터:
chunks - 처리 대상이 되는 중간 결과
관련 항목:
publish(V...)

done

protected void done()
doInBackground 메소드의 실행 완료 후, 이벤트발송쓰레드상에서 실행됩니다. 디폴트 구현은 아무것도 실행하지 않습니다. 서브 클래스는, 이 메소드를 오버라이드(override) 해, 이벤트발송쓰레드상에서 완료 처리를 실행하는 일이 있습니다. 이 메소드의 구현 내부에서 상태를 조회해, 이 태스크의 결과나, 이 태스크가 삭제되지 않은지 어떤지를 확인할 수가 있습니다.

관련 항목:
doInBackground() , isCancelled() , get()

setProgress

protected final void setProgress(int progress)
progress 바운드 프로퍼티을 설정합니다. 0 ~ 100 의 값을 지정하도록 해 주세요.

PropertyChangeListener 메소드는 이벤트발송쓰레드상에서 비동기에 통지를 받으므로,PropertyChangeListeners 가 불려 가기 전에,setProgress 메소드가 여러 차례 불려 가는 일이 있습니다. 퍼포먼스의 향상을 위해, 이러한 모든 호출은 1 회의 호출에 정리합니다. 이 경우, 마지막 호출의 인수만이 유효하게 됩니다.

예를 들어, 다음의 호출이 있다고 합니다.

 setProgress(1);
 setProgress(2);
 setProgress(3);
 
이것은, 값 3 을 가지는 1 회의 PropertyChangeListener 통지에 정리합니다.

파라미터:
progress - 설정하는 진척치
예외:
IllegalArgumentException - 0 ~ 100 이외의 값을 지정했을 경우

getProgress

public final int getProgress()
progress 바운드 프로퍼티을 돌려줍니다.

반환값:
progress 바운드 프로퍼티

execute

public final void execute()
이 메소드는, 워크스 레드에서의 SwingWorker 의 실행 스케줄을 세웁니다. 다수의 워크스 레드를 사용할 수 있습니다. 모든 워크스 레드가 다른 SwingWorkers 의 처리로 Busy 상태가 되어 있는 경우, 이 SwingWorker 는 대기 큐에 들어갑니다.

주:SwingWorker 는 1 회만 실행되도록(듯이) 설계되고 있습니다. SwingWorker 를 여러 차례 실행해도,doInBackground 메소드는 1 회 밖에 불려 가지 않습니다.


cancel

public final boolean cancel(boolean mayInterruptIfRunning)
이 태스크의 실행의 취소를 시도합니다. 태스크가 벌써 완료하고 있었을 경우, 벌써 삭제되고 있었을 경우, 또는 그 외의 이유로써 취소할 수 없었던 경우, 이 시도는 실패합니다. 그 시도가 성공해,cancel 의 호출시에 이 태스크가 기동하지 않았던 경우, 이 태스크가 실행될 것은 없습니다. 태스크가 기동 끝난 경우는, 이 태스크의 정지를 시도할 때, 이 태스크를 실행하고 있는 thread에 끼어들 필요가 있을지 어떨지는,mayInterruptIfRunning 파라미터로 판단합니다.

이 메소드가 복귀한 뒤, 이후의 Future.isDone() 의 호출에서는 항상 true 가 돌려주어집니다. 이 메소드가 true 를 돌려주었을 경우, 이후의 Future.isCancelled() 의 호출에서는 항상 true 가 돌려주어집니다.

정의:
인터페이스 Future <T > 내의 cancel
파라미터:
mayInterruptIfRunning - 이 태스크를 실행하고 있는 thread에 끼어들 필요가 있는 경우는 true, 그렇지 않은 경우는, 실행중의 태스크를 완료할 수 있다
반환값:
태스크를 취소할 수 없었던 경우는 false (일반적으로은 태스크가 벌써 정상적으로 완료하고 있었기 때문에), 그렇지 않은 경우는 true

isCancelled

public final boolean isCancelled()
이 태스크가 정상적으로 완료하기 전에 삭제되었을 경우는 true 를 돌려줍니다.

정의:
인터페이스 Future <T > 내의 isCancelled
반환값:
이 태스크가 완료하기 전에 삭제되었을 경우는 true

isDone

public final boolean isDone()
이 태스크가 완료했을 경우는 true 를 돌려줍니다. 완료의 이유는, 정상 종료, 예외, 취소등이 있습니다만, 어느 경우도 이 메소드는 true 를 돌려줍니다.

정의:
인터페이스 Future <T > 내의 isDone
반환값:
이 태스크가 완료했을 경우는 true

get

public final T  get()
            throws InterruptedException ,
                   ExecutionException 
필요에 따라서 계산이 완료할 때까지 대기해, 그 후, 계산 결과를 가져옵니다.  

주:이벤트발송쓰레드상에서 get 를 호출하면(자), 이 SwingWorker 의 실행이 완료할 때까지, 모든 이벤트 (재페인트등)의 처리가 블록 됩니다.

이벤트발송쓰레드상에서 SwingWorker 를 블록 하려면 , 모덜 다이얼로그를 사용하는 것을 추천합니다.

다음에 예를 나타냅니다.

 class SwingWorkerCompletionWaiter extends PropertyChangeListener {
     private JDialog dialog;

     public SwingWorkerCompletionWaiter(JDialog dialog) {
         this.dialog = dialog;
     }

     public void propertyChange(PropertyChangeEvent event) {
         if ("state".equals(event.getPropertyName())
                 && SwingWorker.StateValue.DONE == event.getNewValue())
{
             dialog.setVisible(false);
             dialog.dispose();
         }
     }
 }
 JDialog dialog = new JDialog(owner, true);
 swingWorker.addPropertyChangeListener(
     new SwingWorkerCompletionWaiter(dialog));
 swingWorker.execute();
 //the dialog will be visible until the SwingWorker is done
 dialog.setVisible(true);
 

정의:
인터페이스 Future <T > 내의 get
반환값:
계산 결과
예외:
InterruptedException - 대기중에 현재의 thread로 인터럽트가 발생했을 경우
ExecutionException - 계산으로 예외가 throw 되었을 경우

get

public final T  get(long timeout,
                   TimeUnit  unit)
            throws InterruptedException ,
                   ExecutionException ,
                   TimeoutException 
필요에 따라서, 최대로 지정된 시간, 계산이 완료할 때까지 대기해, 그 후, 계산 결과가 이용 가능한 경우는 결과를 가져옵니다.  

상세한 것에 대하여는,get() 메소드를 참조해 주세요.

정의:
인터페이스 Future <T > 내의 get
파라미터:
timeout - 대기하는 최장 시간
unit - timeout 인수의 시간 단위
반환값:
계산 결과
예외:
InterruptedException - 대기중에 현재의 thread로 인터럽트가 발생했을 경우
ExecutionException - 계산으로 예외가 throw 되었을 경우
TimeoutException - 대기가 타임 아웃이 되었을 경우

addPropertyChangeListener

public final void addPropertyChangeListener(PropertyChangeListener  listener)
PropertyChangeListener 를 청취자 리스트에 추가합니다. 청취자는, 모든 프로퍼티에 대해서 등록됩니다. 같은 청취자 객체를 여러 차례 추가할 수 있어 추가한 회수만 청취자 객체가 불려 갑니다. listenernull 의 경우, 예외는 throw 되지 않고, 아무것도 행해지지 않습니다.

주:이것은 간이 래퍼입니다. 모든 처리는,getPropertyChangeSupport() 로부터 PropertyChangeSupport 에 위양 됩니다.

파라미터:
listener - 추가되는 PropertyChangeListener

removePropertyChangeListener

public final void removePropertyChangeListener(PropertyChangeListener  listener)
PropertyChangeListener 를 청취자 리스트로부터 삭제합니다. 모든 프로퍼티의 등록을 마친 PropertyChangeListener 를 삭제합니다. listener 를 같은 이벤트 소스에 여러 차례 추가하고 있는 경우는, 이 청취자를 삭제한 뒤 통지를 수신합니다. listenernull 의 경우, 또는 추가되어 있지 않은 경우, 예외는 throw 되지 않고, 아무것도 행해지지 않습니다.

주:이것은 간이 래퍼입니다. 모든 처리는,getPropertyChangeSupport() 로부터 PropertyChangeSupport 에 위양 됩니다.

파라미터:
listener - 삭제되는 PropertyChangeListener

firePropertyChange

public final void firePropertyChange(String  propertyName,
                                     Object  oldValue,
                                     Object  newValue)
모든 등록이 끝난 청취자에게 바운드 프로퍼티이 갱신된 것을 보고합니다. old 치와 new 치가 동일하고, null 가 아닌 경우, 이벤트는 트리거되지 않습니다.

SwingWorker 는, 생성되는 모든 이벤트의 소스가 됩니다.

이벤트발송쓰레드를 취소했을 경우,PropertyChangeListener 는 이벤트발송상에서 비동기에 통지를 수신합니다.  

주:이것은 간이 래퍼입니다. 모든 처리는,getPropertyChangeSupport() 로부터 PropertyChangeSupport 에 위양 됩니다.

파라미터:
propertyName - 변경된 프로퍼티의 프로그램명
oldValue - 프로퍼티의 변경전의 값
newValue - 프로퍼티의 변경 후의 값

getPropertyChangeSupport

public final PropertyChangeSupport  getPropertyChangeSupport()
SwingWorkerPropertyChangeSupport 를 돌려줍니다. 이 메소드는, 바운드 프로퍼티에 빈번하게 액세스 할 필요가 있는 경우에 사용합니다.  

SwingWorker 는, 생성되는 모든 이벤트의 소스가 됩니다.

주:firePropertyChange 또는 fireIndexedPropertyChange 가 이벤트발송쓰레드를 취소했을 경우, 반환되는 PropertyChangeSupport 는, 이벤트발송쓰레드상의 모든 PropertyChangeListener 에 비동기에 통지를 송신합니다.

반환값:
SwingWorkerPropertyChangeSupport

getState

public final SwingWorker.StateValue  getState()
SwingWorker 상태 바운드 프로퍼티을 돌려줍니다.

반환값:
현재 상태

JavaTM Platform
Standard Ed. 6

버그의 보고와 기능의 요청
한층 더 자세한 API 레퍼런스 및 개발자 문서에 대해서는,Java SE 개발자용 문서를 참조해 주세요. 개발자전용의 상세한 해설, 개념의 개요, 용어의 정의, 버그의 회피책, 및 코드 실례가 포함되어 있습니다.

Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.