2011-05-16 29 views
4

我需要执行的任务包括从外部服务器请求一些数据,对数据执行一些(相当冗长的)处理,然后使用处理结果更新GUI。由于服务器可能没有响应,因此该任务非常适合SwingWorker:方法获取结果,然后done方法更新GUI。使用计时器启动SwingWorker?

我需要这种情况每隔几秒发生一次。我知道我可以使用while循环和Thread.sleep,并在每次睡眠后创建一个新的SwingWorker。但是我读过的所有东西在使用循环和睡眠时都会皱眉。我想使用一个计时器,但:

  • 使用摆动计时器似乎适得其反;因为它们在EDT上运行,所以我基本上没有理由使用SwingWorker的doInBackground方法。如果服务器没有响应,则GUI将无响应。

  • 使用java.util.Timer看起来有点浪费:它似乎为TimerTask()创建了一个后台线程,并且由于我只是创建了一个SwingWorker来完成实际的工作,我本质上是创建了一个创建另一个后台线程的后台线程。

有人可以告诉我什么是最好的解决方案?我想坚持使用SwingWorker,因为它看起来非常适合这项任务,但是如果我能够帮助它,我想避免使用while循环。

感谢

+0

我的问题是一样的气垫船全鳗鱼,为什么用java.swing.Timer似乎适得其反,这只是你的timming何时何地你会打电话给java.swing。Timer myTimer#.setDelay(int in miliseconds); – mKorbel 2011-05-16 10:53:34

回答

2

你可以使用一个ScheduledExecutorService

scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) 

// get a scheduled executor service with one thread 
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 
// schedule the worker at an intervall of 5 seconds 
scheduler.scheduleAtFixedRate(myWorker, 0, 5, TimeUnit.SECONDS); 
+1

是的,这是可能的,因为Executor可以启动SwingWorker并且使用“multiThreading”,注1)与SwingWorkers Threads的实际数量 - Execuor的过度限制 - 2)Executor + SwingWorker位于Top25错误http://bugs.sun.com/ top25_bugs.do – mKorbel 2011-05-16 10:16:58

+0

它需要Runnable;这是否表明它正在启动一个新的线程?创建我的SwingWorker(然后睡眠,循环等)的线程是主线程:一旦创建GUI,就没有其他需要做的事情了...... – Swiftslide 2011-05-16 10:20:34

+0

ScheduledExecutorService实际上包含一个线程池。在这种情况下只有一个。这个线程将被提交给这个服务的所有runnables/workes使用。 @Shwiftslide又是什么问题? ;-) – pintxo 2011-05-16 15:23:09

2

我不明白为什么你不能使用一个Swing计时器开始摇摆工人。你有什么尝试?

+0

@ Hovercraft充满鳗鱼,我也是,:-)肯定通过使用java.util.Timer + Executor + SwingWorker应该是比很多乐趣更多,+1 :-) – mKorbel 2011-05-16 10:50:20

0

您要检索的数据集有多大?如果它相当小,我会完全分离获取/处理和显示的任务。

  1. 使用某种内存高速缓存来保存最近处理的数据集。
  2. 使用javax.swing.Timer用高速缓存的数据更新GUI。
  3. 使用java.util.Timer从数据库获取数据,处理数据并更新缓存。
  4. 请注意缓存中两次之间的同步问题。您不希望您的摇摆计时器在其他计时器正在更新的同时抓取数据。
1

我认为你和SwingWorker在正确的轨道上。现在您需要查看其发布和处理方法。随着处理过程的进行,您从后台线程发布()一个对象,然后在Swing(EDT)线程上调用process()方法,以便您可以更新gui。

这种方式没有一堆定时器和其他线程来协调。

的javadoc与素数一个简单的例子: http://download.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html