|
JavaTM Platform Standard Ed. 6 |
|||||||||
앞의 클래스 차의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요 : 상자 | 필드 | 생성자 | 메소드 | 상세: 필드 | 생성자 | 메소드 |
java.lang.Objectjavax.swing.SwingWorker<T, V>
T
- 이 SwingWorker 의
doInBackground
메소드 및 get
메소드에 의해 반환되는 결과의 형태V
- 이 SwingWorker 의
publish
메소드
및 process
메소드를 사용해 중간 결과를 계산하는 경우에 사용하는 형태public abstract class SwingWorker<T, V>
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:execute()
메소드는 이 thread상에서 불려 갑니다. 이 메소드는, 워크스 레드에서의 SwingWorker
의 실행 스케줄을 세워 그 정보를 즉시 돌려줍니다. 취득
메소드를 사용해 SwingWorker
의 완료를 대기할 수도 있습니다.
워크스 레드:doInBackground()
메소드는 이 thread상에서 불려 갑니다. 여기서, 모든 백그라운드 작업이 발생합니다. PropertyChangeListeners
에 바운드 프로퍼티의 변경을 통지하려면 ,firePropertyChange
메소드와 getPropertyChangeSupport()
메소드를 사용합니다. 디폴트에서는,state
와 progress
의 2 개의 바운드 프로퍼티을 사용할 수 있습니다.
이벤트발송쓰레드:Swing 관련의 모든 작업은, 이 thread상에서 발생합니다. SwingWorker
는 process
메소드와 done()
메소드를 호출해, 이 thread상의 모든 PropertyChangeListeners
에 통지합니다.
현재의 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
SwingWorker
는 Runnable
를 구현하므로,SwingWorker
를 Executor
에 송신해, 실행할 수가 있습니다.
상자의 클래스의 개요 | |
---|---|
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 ()
이 SwingWorker 의 PropertyChangeSupport 를 돌려줍니다. |
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 |
생성자 의 상세 |
---|
public SwingWorker()
SwingWorker
를 구축합니다.
메소드의 상세 |
---|
protected abstract T doInBackground() throws Exception
이 메소드는 1 회만 실행됩니다.
주:이 메소드는, 백그라운드 thread로 실행됩니다.
Exception
- 결과를 계산할 수 없었던 경우public final void run()
Future
에 계산 결과를 설정합니다.
Runnable
내의 run
RunnableFuture <T >
내의 run
Thread.run()
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)
protected void process(List <V > chunks)
publish
메소드로부터 비동기에 데이타체크를 수신합니다.
상세한 것에 대하여는,publish(V...)
메소드를 참조해 주세요.
chunks
- 처리 대상이 되는 중간 결과publish(V...)
protected void done()
doInBackground
메소드의 실행 완료 후, 이벤트발송쓰레드상에서 실행됩니다. 디폴트 구현은 아무것도 실행하지 않습니다. 서브 클래스는, 이 메소드를 오버라이드(override) 해, 이벤트발송쓰레드상에서 완료 처리를 실행하는 일이 있습니다. 이 메소드의 구현 내부에서 상태를 조회해, 이 태스크의 결과나, 이 태스크가 삭제되지 않은지 어떤지를 확인할 수가 있습니다.
doInBackground()
,
isCancelled()
,
get()
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 이외의 값을 지정했을 경우public final int getProgress()
progress
바운드 프로퍼티을 돌려줍니다.
public final void execute()
SwingWorker
의 실행 스케줄을 세웁니다. 다수의 워크스 레드를 사용할 수 있습니다. 모든 워크스 레드가 다른 SwingWorkers
의 처리로 Busy 상태가 되어 있는 경우, 이 SwingWorker
는 대기 큐에 들어갑니다.
주:SwingWorker
는 1 회만 실행되도록(듯이) 설계되고 있습니다. SwingWorker
를 여러 차례 실행해도,doInBackground
메소드는 1 회 밖에 불려 가지 않습니다.
public final boolean cancel(boolean mayInterruptIfRunning)
이 메소드가 복귀한 뒤, 이후의 Future.isDone()
의 호출에서는 항상 true 가 돌려주어집니다. 이 메소드가 true 를 돌려주었을 경우, 이후의 Future.isCancelled()
의 호출에서는 항상 true 가 돌려주어집니다.
Future <T >
내의 cancel
mayInterruptIfRunning
- 이 태스크를 실행하고 있는 thread에 끼어들 필요가 있는 경우는 true, 그렇지 않은 경우는, 실행중의 태스크를 완료할 수 있다
public final boolean isCancelled()
Future <T >
내의 isCancelled
public final boolean isDone()
Future <T >
내의 isDone
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 되었을 경우public final T get(long timeout, TimeUnit unit) throws InterruptedException , ExecutionException , TimeoutException
상세한 것에 대하여는,get()
메소드를 참조해 주세요.
Future <T >
내의 get
timeout
- 대기하는 최장 시간unit
- timeout 인수의 시간 단위
InterruptedException
- 대기중에 현재의 thread로 인터럽트가 발생했을 경우
ExecutionException
- 계산으로 예외가 throw 되었을 경우
TimeoutException
- 대기가 타임 아웃이 되었을 경우public final void addPropertyChangeListener(PropertyChangeListener listener)
PropertyChangeListener
를 청취자 리스트에 추가합니다. 청취자는, 모든 프로퍼티에 대해서 등록됩니다. 같은 청취자 객체를 여러 차례 추가할 수 있어 추가한 회수만 청취자 객체가 불려 갑니다. listener
가 null
의 경우, 예외는 throw 되지 않고, 아무것도 행해지지 않습니다.
주:이것은 간이 래퍼입니다. 모든 처리는,getPropertyChangeSupport()
로부터 PropertyChangeSupport
에 위양 됩니다.
listener
- 추가되는 PropertyChangeListener
public final void removePropertyChangeListener(PropertyChangeListener listener)
PropertyChangeListener
를 청취자 리스트로부터 삭제합니다. 모든 프로퍼티의 등록을 마친 PropertyChangeListener
를 삭제합니다. listener
를 같은 이벤트 소스에 여러 차례 추가하고 있는 경우는, 이 청취자를 삭제한 뒤 통지를 수신합니다. listener
가 null
의 경우, 또는 추가되어 있지 않은 경우, 예외는 throw 되지 않고, 아무것도 행해지지 않습니다.
주:이것은 간이 래퍼입니다. 모든 처리는,getPropertyChangeSupport()
로부터 PropertyChangeSupport
에 위양 됩니다.
listener
- 삭제되는 PropertyChangeListener
public final void firePropertyChange(String propertyName, Object oldValue, Object newValue)
old
치와 new
치가 동일하고, null 가 아닌 경우, 이벤트는 트리거되지 않습니다.
이 SwingWorker
는, 생성되는 모든 이벤트의 소스가 됩니다.
이벤트발송쓰레드를 취소했을 경우,PropertyChangeListener
는 이벤트발송상에서 비동기에 통지를 수신합니다.
주:이것은 간이 래퍼입니다. 모든 처리는,getPropertyChangeSupport()
로부터 PropertyChangeSupport
에 위양 됩니다.
propertyName
- 변경된 프로퍼티의 프로그램명oldValue
- 프로퍼티의 변경전의 값newValue
- 프로퍼티의 변경 후의 값public final PropertyChangeSupport getPropertyChangeSupport()
SwingWorker
의 PropertyChangeSupport
를 돌려줍니다. 이 메소드는, 바운드 프로퍼티에 빈번하게 액세스 할 필요가 있는 경우에 사용합니다.
이 SwingWorker
는, 생성되는 모든 이벤트의 소스가 됩니다.
주:firePropertyChange
또는 fireIndexedPropertyChange
가 이벤트발송쓰레드를 취소했을 경우, 반환되는 PropertyChangeSupport
는, 이벤트발송쓰레드상의 모든 PropertyChangeListener
에 비동기에 통지를 송신합니다.
SwingWorker
의 PropertyChangeSupport
public final SwingWorker.StateValue getState()
SwingWorker
상태 바운드 프로퍼티을 돌려줍니다.
|
JavaTM Platform Standard Ed. 6 |
|||||||||
앞의 클래스 차의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요 : 상자 | 필드 | 생성자 | 메소드 | 상세: 필드 | 생성자 | 메소드 |
Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.