java - Swing 计时器与可能的长时间运行的后台任务相结合

标签 java swing

我需要重复执行一项影响 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/

相关文章:

java - 单击按钮时将 ImageIcon 添加到已经可见的 GUI

java - JTableCombo 值在运行时未更改

java - 什么是序列化和可分包

java - 在 Java 中为网格创建绘制矩形(填充为黑色)函数

java - 标记未知 s :property

java - RxJava retryWhen 重新订阅传播

java - 如何在JtabbedPane中不显示选项卡标题?

java - 尝试让 BufferedWriter 将文本区域保存到 txt 文件

java - 从 spring-boot 应用程序到 JBoss EAP6 HornetQ 主题的 JMS 连接失败

java - 如何测试 Java getter 方法