1)Initial threads(初始线程),此类线程将执行初始化应用代码; 2)The event dispatch thread(事件派发线程),所有的事件处理代码在这里执行。大多数与Swing框架交互的代码也必须执行这个线程; 3)Worker threads(工作线程),也称作background threads(后台线程),此类线程将执行所有消耗时间的任务。
SwingUtilities.invokeLater(new Runnable()) { public void run() { createAndShowGUI(); } }
1)SwingWorker的子类可以定义一个方法,done。当后台任务完成的时候,它将自动的被事件派发线程调用。 2)SwingWorker类实现java.util.concurrent.Future。这个接口允许后台任务提供一个返回值给其他线程。该接口中的方法还提供允许撤销后台任务以及确定后台任务是被完成了还是被撤销的功能。 3)后台任务可以通过调用SwingWorker.publish来提供中间结果,事件派发线程将会调用该方法。 4)后台任务可以定义绑定属性。绑定属性的变化将触发事件,事件派发线程将调用事件处理程序来处理这些被触发的事件。
SwingWorker worker = new SwingWorker<ImageIcon[], Void>() { @Override public ImageIcon[] doInBackground() { final ImageIcon[] innerImgs = new ImageIcon[nimgs]; for (int i = 0; i < nimgs; i++) { innerImgs = loadImage(i+1); } return innerImgs; } @Override public void done() { //Remove the "Loading images" label. animator.removeAll(); loopslot = -1; try { imgs = get(); } catch (InterruptedException ignore) {} catch (java.util.concurrent.ExecutionException e) { String why = null; Throwable cause = e.getCause(); if (cause != null) { why = cause.getMessage(); } else { why = e.getMessage(); } System.err.println("Error retrieving file: " + why); } } };
1)调用SwingWorker.get没有参数。如果后台任务没有完成,get方法将阻塞直到它完成; 2)调用SwingWorker.get带参数指定timeout。如果后台任务没有完成,阻塞直到它完成-除非timeout期满,在这种情况下,get将抛出java.util.concurrent.TimeoutException。
private static class FlipPair { private final long heads, total; FlipPair(long heads, long total) { this.heads = heads; this.total = total; } }
private class FlipTask extends SwingWorker<Void, FlipPair> {
@Override protected Void doInBackground() { long heads = 0; long total = 0; Random random = new Random(); while (!isCancelled()) { total++; if (random.nextBoolean()) { heads++; } publish(new FlipPair(heads, total)); } return null; }
protected void process(List pairs) { FlipPair pair = pairs.get(pairs.size() - 1); headsText.setText(String.format("%d", pair.heads)); totalText.setText(String.format("%d", pair.total)); devText.setText(String.format("%.10g", ((double) pair.heads)/((double) pair.total) - 0.5)); }
1)当收到一个interrupt时,将被终止; 2)调用SwingWorker.isCanceled,如果SwingWorker调用cancel,该方法将返回true。
Progress绑定变量是一个整型变量,变化范围由0到100。它预定义了setter (the protected SwingWorker.setProgress和getter (the public SwingWorker.getProgress)方法。
1) PENDING 这个状态持续的时间为从对象的建立知道doInBackground方法被调用; 2) STARTED 这个状态持续的时间为doInBackground方法被调用前一刻直到done方法被调用前一刻; 3) DONE 对象存在的剩余时间将保持这个状态。 需要返回当前state的值可调用SwingWorker.getState。
两个由Future接口提供的方法,同样可以报告后台任务的状态。如果任务被取消,isCancelled返回true。此外,如果任务完成,即要么正常的完成,要么被取消,isDone返回true。
来源:即时通讯网 - 即时通讯开发者社区!
轻量级开源移动端即时通讯框架。
快速入门 / 性能 / 指南 / 提问
轻量级Web端即时通讯框架。
详细介绍 / 精编源码 / 手册教程
移动端实时音视频框架。
详细介绍 / 性能测试 / 安装体验
基于MobileIMSDK的移动IM系统。
详细介绍 / 产品截图 / 安装体验
一套产品级Web端IM系统。
详细介绍 / 产品截图 / 演示视频
引用此评论
引用:潴頭鎶鎶 发表于 2015-8-28 17:29 总结的太好了。好好看一看。
引用:shengwei729 发表于 2016-04-23 15:56 前段时间刚好出现这样的 问题
引用:zjj7188 发表于 2016-04-26 17:43 swingworker与Android中的 AsyncTask很相似
引用:JackJiang 发表于 2016-04-26 18:09 Google 的Android 那边有不少SUN公司原来Java团队的人过去的。去查查 《Effective Java》这本书的作者, ...
引用:zjj7188 发表于 2016-04-26 18:52 对了,我还想问,对于一个初学者而言,学Java UI的设计是学swing好还是javaFx好呢。关于这个,我有点困惑
引用:JackJiang 发表于 2016-04-26 21:06 你就当JavaFX不存在吧
引用:zjj7188 发表于 2016-04-27 18:26 为什么呢
精华主题数超过100个。
连续任职达2年以上的合格正式版主
为论区做出突出贡献的开发者、版主等。
Copyright © 2014-2024 即时通讯网 - 即时通讯开发者社区 / 版本 V4.4
苏州网际时代信息科技有限公司 (苏ICP备16005070号-1)
Processed in 0.425797 second(s), 46 queries , Gzip On.