使用计时器启动SwingWorker?

| 我需要执行的任务包括从外部服务器请求一些数据,对数据执行一些(相当长的)处理,然后使用处理结果更新GUI。因为服务器可能没有响应,所以该任务非常适合SwingWorker:
doInBackground()
方法获取结果,然后done方法更新GUI。 我需要每隔几秒钟发生一次。我知道我可以只使用while循环和Thread.sleep,并在每次睡眠后创建一个新的SwingWorker。但是我读过的所有文章都对使用循环和睡眠不满意。我想使用计时器,但: 使用摆动计时器似乎适得其反;由于它们在EDT上运行,因此我基本上没有理由使用SwingWorker的doInBackground方法。如果服务器没有响应,则GUI将无响应。 使用java.util.Timer似乎有点浪费:它似乎为TimerTask()创建了一个后台线程,由于我只是创建一个SwingWorker来完成实际工作,因此我实质上是在创建一个后台线程,该线程用于创建另一个后台线程。 谁能告诉我什么是最佳解决方案?我想坚持使用SwingWorker,因为它似乎非常适合该任务,但是如果可以的话,我想避免使用while循环。 谢谢     
已邀请:
您可以使用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);
    
我不明白为什么您不能使用Swing计时器来启动Swing Worker。你尝试了什么?     
我认为您在SwingWorker方面走的正确。现在,您需要查看其发布和处理方法。随着处理的进行,您从后台线程publish()一个对象,然后在Swing(EDT)线程上调用process()方法,以便更新gui。 这样一来,就不需要一堆计时器和其他线程来协调。 javadocs有一个带有质数的简单示例: http://download.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html     
您要检索的数据集有多大?如果它很小,我将完全分离获取/处理和显示的任务。 使用某种类型的内存缓存来保存最近处理的数据集。 使用ѭ2来使用缓存的数据更新GUI。 使用“ 3”从数据库中获取数据,对其进行处理并更新高速缓存。 请注意两次缓存之间的同步问题。您不希望您的摆动计时器在另一个计时器正在更新数据的同时获取数据。     

要回复问题请先登录注册