gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:52:03 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com