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();}
@Overrideprotected 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。
因为PropertyChangeListeners通知异步的事件调度线程多次调用的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都取消了事件调度线程的事件调度线程任何PropertyChangeListeners。
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.