T
结果返回的类型的
SwingWorker's
doInBackground
和
get
方法
V
-进行中间结果的
SwingWorker's
publish
和
process
方法的类型
public abstract class SwingWorker<T,V> extends Object implements RunnableFuture<T>
SwingWorker
线程是不确定的,不应依靠正确的战略。
写一个多线程应用程序中使用摆动时,有两个约束牢记:(指 Concurrency in Swing 详情):
这些限制意味着一种密集型计算至少需要两个线程时间的GUI应用程序:1)一个线程执行冗长的任务,和2)的事件调度线程(EDT)所有GUI相关的活动。这涉及到线程间的通信,这可能是棘手的实现。
SwingWorker
是专为你需要在后台线程上运行一个长时间运行的任务和用户界面的时候也做提供更新的情况下,或在处理。子类必须实现doInBackground()
SwingWorker
方法进行后台计算。
工作流
有三个线程参与一SwingWorker
生命周期:
电流螺纹:的execute()
方法调用这个线程。它计划在工人线程的执行SwingWorker
并立即返回。一个可以等待SwingWorker
完成使用get
方法。
工人螺纹:的doInBackground()
方法调用这个线程。这是所有的背景活动都应该发生的地方。通知PropertyChangeListeners
关于绑定的属性变化使用firePropertyChange
和getPropertyChangeSupport()
方法。默认情况下,有两个绑定的属性:state
和progress
。
事件调度线程:所有摆在这个线程发生相关的活动。SwingWorker
调用process
和done()
方法通知该线程的任何PropertyChangeListeners
。
通常,这电流线程是事件调度线程。
在doInBackground
法在工人线程调用,SwingWorker
通知任何PropertyChangeListeners
关于state
属性改变StateValue.STARTED
。在doInBackground
方法完成done
方法执行。然后SwingWorker
通知任何PropertyChangeListeners
关于state
属性改变StateValue.DONE
。
SwingWorker
设计只被执行一次。执行SwingWorker
不止一次不会导致调用doInBackground
方法事半功倍。
示例用法
下面的例子说明了最简单的用例。一些处理是在后台完成的,当你更新一个摆动组件时。
说我们要找到生活的意义”和在JLabel
显示结果。
最后的JLabel标签;meaningoflifefinder SwingWorker类延伸 <字符串> {对象@Override
公共字符串doinbackground() {返回findthemeaningoflife();}@Override
protected void done() {尝试{setText(get())标签;}捕获(异常忽略){}}}(新meaningoflifefinder() execute()); 字符串>
下一个例子是有用的情况下,你要处理的数据是在事件调度线程准备。
现在我们要找的第n个素数和一个JTextArea
显示结果。虽然这是计算,我们要更新我们的进展,在JProgressBar
。最后,我们还想打印素数System.out
。
类primenumberstask延伸SwingWorker <列表<整数> ,整数> {primenumberstask(JTextArea文本,int numberstofind){//初始化}@Override
公示名单 <整数> doinbackground() {而(!足够和!iscancelled()){nextprimenumber()数=;发布(编号);设置任务的进度(100×号。size() / numberstofind);}}返回数字的;}@Override
受保护的无效进程(列表 <整数> 块){为(int数:块){文本。追加(数+“\n”);}}}新jtextarea() JTextArea文本=;最后jprogressbar ProgressBar =新jprogressbar(0,100);primenumberstask任务=新primenumberstask(textarea,N);addpropertychangelistener(任务。新的propertychangelistener() {公共无效propertychange(PropertyChangeEvent EVT){如果(“进步”。等于(EVT。getpropertyname())){ProgressBar。setValue(EVT(整数)。getnewvalue());}}});execute()任务;系统。出来。println(任务。get());//打印的所有素数,我们有 整数> 整数> 列表<整数>
因为SwingWorker
实现Runnable
,一SwingWorker
可以提交执行Executor
。
Modifier and Type | Class and Description |
---|---|
static class |
SwingWorker.StateValue
为
state 绑定属性值。
|
Constructor and Description |
---|
SwingWorker()
构建这
SwingWorker 。
|
Modifier and Type | Method and Description |
---|---|
void |
addPropertyChangeListener(PropertyChangeListener listener)
增加了一个
PropertyChangeListener 的监听器列表。
|
boolean |
cancel(boolean mayInterruptIfRunning)
试图取消此任务的执行。
|
protected abstract T |
doInBackground()
计算一个结果,或抛出一个异常,如果无法这样做。
|
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<V>) 方法。
|
void |
removePropertyChangeListener(PropertyChangeListener listener)
从列表中移除侦听器
PropertyChangeListener 。
|
void |
run()
这一集
Future 计算的结果除非它已被取消。
|
protected void |
setProgress(int progress)
集
progress 绑定属性。
|
protected abstract T doInBackground() throws 异常
请注意,此方法仅执行一次。
注意:此方法在后台线程中执行。
异常
如果无法计算的结果
public final void run()
Future
计算的结果除非它已被取消。
run
接口
Runnable
run
接口
RunnableFuture<T>
Thread.run()
@SafeVarargs protected final void publish(V... chunks)
process(java.util.List<V>)
方法。这种方法是用在
doInBackground
方法为在
process
方法提供事件调度线程处理的中间结果。
因为process
方法是异步调用的事件调度线程多次调用的publish
方法可能发生之前process
方法执行。性能用途这些调用合并成一个级联参数调用。
例如:
发布(“1”);发布(“2”,“3”);发布(“4”,“5”,“6”);可能导致:
过程(“1”、“2”、“3”、“4”、“5”、“6”、“”)
示例用法。这段代码加载一些表格数据和更新DefaultTableModel
它。注意安全变异的台式在process
方法因为是在事件调度线程调用。
类tableswingworker延伸SwingWorker <默认表格模型类,对象[ ]> {私人最终默认表格模型类的台式;公共tableswingworker(默认表格模型类的台式){this.tablemodel =台式;}@Override
保护默认表格模型类doinbackground()抛出异常{(对象为[ ]行= loaddata();!iscancelled() &行!= null;行= loaddata()){发布((对象[ ])行);}返回的台式;}@Override
受保护的无效进程(列表 <对象> 块){对于(对象[ ]行:块)台式addRow(行);}}} 对象> 默认表格模型类,对象[>
chunks
中间结果的过程
process(java.util.List<V>)
protected void process(List<V> chunks)
publish
接收数据块的方法。
请参阅publish(V...)
方法的更多细节。
chunks
中间结果的过程
publish(V...)
protected void done()
doInBackground
方法完成。默认实现不做任何事。子类可以重写此方法以完成动作的事件调度线程。请注意,您可以在该方法的实现内查询状态,以确定此任务的结果或此任务是否已被取消。
doInBackground()
,
isCancelled()
,
get()
protected final void setProgress(int progress)
progress
绑定属性。该值应为0至100。
因为PropertyChangeListener
s通知异步的事件调度线程多次调用的setProgress
方法可能发生在任何PropertyChangeListeners
调用。性能用途这些调用合并成一个调用的最后调用参数只。
例如,下面的invokations:
设置任务的进度(1);设置任务的进度(2);设置任务的进度(3);会导致与价值
3
PropertyChangeListener
通知单。
progress
-进步值设置
IllegalArgumentException
-不是从0到100的值
public final int getProgress()
progress
绑定属性。
public final void execute()
SwingWorker
时间表上的工人线程执行。有一些工人可用线程。在所有的事件工人线程忙于处理其他
SwingWorkers
这
SwingWorker
放入等待队列。
注:SwingWorker
设计只被执行一次。执行SwingWorker
不止一次不会导致调用doInBackground
方法事半功倍。
public final boolean cancel(boolean mayInterruptIfRunning)
cancel
称,这个任务不应该跑。如果任务已经开始,然后
mayInterruptIfRunning
参数确定线程执行这个任务应该是为了阻止任务中断。
此方法返回后,随后调用Future.isDone()
将总是返回true
。随后调用Future.isCancelled()
永远如果这个方法返回的返回true
true
。
public final boolean isCancelled()
true
如果这个任务完成之前取消正常。
isCancelled
接口
Future<T>
true
如果这个任务完成之前取消
public final boolean isDone()
true
如果完成这个任务。完成可能是由于正常终止,例外,或取消——在所有这些情况下,此方法将返回
true
。
public final T get() throws InterruptedException, ExecutionException
注意:调用get
在事件调度线程块全部的事件,包括重画,从这SwingWorker
直到完成加工。
当你想SwingWorker
阻塞在事件调度线程我们推荐你使用模态对话框。
例如:
类swingworkercompletionwaiter延伸propertychangelistener {私人JDialog对话框;公共swingworkercompletionwaiter(JDialog对话框){this.dialog =对话框;}公共无效propertychange(PropertyChangeEvent事件){如果(“状态”。等于(事件。getpropertyname())与swingworker.statevalue.done = =事件。getnewvalue()){对话框。setVisible(假);dispose()对话框;}}}JDialog对话框=新的JDialog(老板,真的);addpropertychangelistener(SwingWorker。新的swingworkercompletionwaiter(对话));execute() SwingWorker;//对话框将可见直到SwingWorker做对话框。setVisible(true);
get
接口
Future<T>
InterruptedException
-如果当前线程被中断等待
ExecutionException
如果计算抛出一个异常
public final T get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
请参阅get()
详情。
get
接口
Future<T>
timeout
-最大等待时间
unit
- timeout参数的时间单位
InterruptedException
-如果当前线程被中断等待
ExecutionException
如果计算抛出一个异常
TimeoutException
如果等待超时
public final void addPropertyChangeListener(PropertyChangeListener listener)
PropertyChangeListener
的监听器列表。侦听器是为所有属性注册的。同一个侦听器对象可以添加一次以上,并将被调用多次,因为它添加了。如果
listener
是
null
,不引发异常而不采取行动。
注意:这只是一个方便的包装。所有的工作都委托给PropertyChangeSupport
从getPropertyChangeSupport()
。
listener
-
PropertyChangeListener
加以补充
public final void removePropertyChangeListener(PropertyChangeListener listener)
PropertyChangeListener
。这消除了
PropertyChangeListener
被注册为所有属性。如果
listener
曾不止一次地对同一事件的消息人士补充说,这将是一个较少的时间通知后。如果
listener
是
null
,或是不加,不引发异常而不采取行动。
注意:这只是一个方便的包装。所有的工作都委托给PropertyChangeSupport
从getPropertyChangeSupport()
。
listener
-
PropertyChangeListener
被删除
public final void firePropertyChange(String propertyName, Object oldValue, Object newValue)
old
和
new
平等和非空。
这SwingWorker
将对所有产生的事件源。
当取消事件调度线程PropertyChangeListeners
通知异步的事件调度线程。
注意:这只是一个方便的包装。所有的工作都委托给PropertyChangeSupport
从getPropertyChangeSupport()
。
propertyName
-房地产,专业名称变更
oldValue
-属性的旧值
newValue
-新的属性值
public final PropertyChangeSupport getPropertyChangeSupport()
SwingWorker
的
PropertyChangeSupport
。这种方法时,使用灵活的访问绑定属性支持是必要的。
这SwingWorker
将对所有产生的事件源。
注意:返回的PropertyChangeSupport
通知异步的事件,firePropertyChange
或fireIndexedPropertyChange
都取消了事件调度线程的事件调度线程任何PropertyChangeListener
s。
SwingWorker
PropertyChangeSupport
public final SwingWorker.StateValue getState()
SwingWorker
状态绑定属性。
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.