我需要重复执行一项影响 GUI 相关和非 GUI 相关对象的任务。需要注意的是,如果在触发下一个计时器事件时前一个任务尚未完成,则不应执行任何操作。 我最初的想法是将 SwingTimer 与 javax.swing.SwingWorker 对象结合使用。一般设置如下所示。
class
{
timer = new Timer(speed, this);
timer.start();
public void actionPerformed(ActionEvent e)
{
SwingWorker worker = new SwingWorker() {
@Override
public ImageIcon[] doInBackground() {
// potential long running task
}
@Override
public void done() {
// update GUI on event dispatch thread when complete
}
}
}
我发现这种方法的一些潜在问题是:
1) 如果在计时器触发下一个 ActionEvent 之前某个工作线程尚未完成,则多个 SwingWorkers 将处于 Activity 状态。
2) SwingWorker 仅被设计为执行一次,因此保留对工作线程的引用并重用(不是吗?)是一个可行的选择。
是否有更好的方法来实现这一目标?
最佳答案
对于 (1),ScheduledThreadPoolExecutor
上的 scheduleAtFixedRate()
方法可能有用。来自javadoc:
If any execution of this task takes longer than its period, then subsequent executions may start late, but will not concurrently execute.
对于 (2),您似乎可以定义 SwingWorker
的子类,并为每次迭代构造该子类的新实例,而不是实例化匿名子类。
关于java - Swing 计时器与可能的长时间运行的后台任务相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2593605/