SwingWorker
使用它们看起来要简单得多。
基本上,您需要就您想要实现的目标做出一些基本决定。
- 您想在进程运行时定期返回更新还是
- 您想返回该过程的结果...还是两者都返回?
- 您想提供进展更新吗?
根据您想要执行的操作,将更改您声明 SwingWorker 的方式。
例如...
public class HardWorker extends SwingWorker<ReturnValueType, PeriodicalType> {
Where ReturnValueType
是工作人员将生成的最终结果,并且PeriodicalType
如果您想要执行定期更新,则可以发送回 UI 线程的对象类型(这些是您可以自己指定的值)。
您可以指定Void
or Object
对于这些值中的任何一个你应该不关心
执行时,SwingWorker
将会通知doInBackground
,此方法将在其自己的线程内调用,从而允许在事件调度线程之外执行长时间运行的任务。
如果您想在之前将值发送回 UIdoInBackground
方法执行完毕,可以调用publish(instanceOfPeriodicalType)
。传递给此方法的值最终将传递给process
method.
因为有可能将多个项目发送到publish
方法,将process
方法提供了一个List<PeriodicalType>
争论。调用时,此方法将在 EDT 上下文中执行,从而允许您更新 UI。
Once doInBackground
完成后,将会return
类型的返回值ReturnValueType
(or null
如果你不在乎)。
如果您对此结果感兴趣,您应该使用SwingWorker#get
,但你应该注意这个方法将阻塞,直到doInBackground
返回,这意味着您不应该在 EDT 中调用此方法,除非您知道doInBackground
方法已返回。您可以使用它来检查工作人员的状态isDone
or isCancelled
方法,或者...
你可以使用PropertyChangeListener
并监控state
属性或覆盖done
的方法SwingWorker
.
如果您想提供进度更新,则在doInBackground
方法,你可以调用setProgress
更新工人的进度。这将触发一个PropertyChangeEvent
named progress
,您可以通过使用PropertyChangeListener
。对此侦听器的调用将在 EDT 的上下文中进行。
看一眼:
- 摇摆工人 http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html
- 工作线程和 SwingWorker http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html
更多细节。
一般来说,为了使用SwingWorker
,您想要做的是将您的设计分成两组。可以在后台完成的所有事情以及需要在 EDT 内完成的所有事情。
您可以开始构建您的工作人员的基本概念。
基本示例...
这假设了很多。基本上,它假设 UI 已设置,这将用于挑选新结果并将它们传递回特定系列。
基本上,按照要求,工人会被疯狂,系列会传递给它......
GraphWorker worker = new GraphWorker(series);
worker.execute();
然后工作将执行查询并将结果传递回process
method
public class GraphWorker extends SwingWorker<Void, String[]> {
private TimeSeries series;
private Second sec;
public GraphWorker(TimeSeries series) {
this.series = series;
sec = new Second();
}
@Override
protected Void doInBackground() throws Exception {
ResultSet rs;
Connection conn = null;
try {
conn = (Connection) getMySqlConnection();
Statement st = conn.createStatement();
rs = st.executeQuery("SHOW GLOBAL STATUS");
while (rs.next()) {
publish(new String[]{rs.getString(1), rs.getString(2)});
}
} finally {
conn.close();
}
return null;
}
@Override
protected void process(List<String[]> chunks) {
for (String[] value : chunks) {
try {
int iValue = Integer.parseInt(value[1]);
series.add(sec, Value);
} catch (NumberFormatException exp) {
exp.printStackTrace();
}
}
}
}