在Java中重复执行SwingWorker

时间:2013-09-09 21:02:53

标签: java multithreading swing repeat swingworker

我正在阅读多篇文章,但我无法找到问题的明确答案。

我有一个应用程序(主框架),它有一个开始和停止按钮,只有一个jTextArea。当用户按下“开始”按钮时,将实例化SwingWorker类并运行(execute())任务。该任务是连接到数据库并进行一些检查。对于每次检查,它都会正确更新jTextArea,一切都很好。当按下停止按钮时,我将isCancelled()设置为true,因此后台进程停止(我在SwingWorker内部进行了相应的检查以停止执行等)。

我想要做的是当用户按下“开始”时,SwingWorker开始执行,睡眠几分钟然后重新运行相同的任务。按下“停止”按钮后,一切都会停止。

我怎样才能实现这一目标?我知道SwingWorker后台进程应该运行一次。这样做的其他方法是什么?请注意,我选择SwingWorker的原因是因为我想在后台进程运行时更新jTextArea。

提前谢谢。

2 个答案:

答案 0 :(得分:5)

您可以只运行一次SwingWorker,无一例外。可能的解决方案包括:

  • 每次需要时创建一个新的SwingWorker对象,运行它,并在完成后停止并丢弃它。
  • 在整个程序运行期间运行单个SwingWorker,在按下停止时不要取消它,而是暂停它(如何取决于我们不要使用的代码的非Swing部分不知道),并且在按下播放时唤醒它。状态设计模式可以很好地适用于此。

关于你的陈述,

  

我想要做的是当用户按下“开始”时,SwingWorker开始执行,睡眠几分钟然后重新运行相同的任务。按下“停止”按钮后,一切都会停止。

考虑在SwingWorker内部使用ScheduledExecutorService。 ScheduledExecutorService创建ScheduledFuture<V>,如果需要,可以取消。


修改
您的意见和我的回复:

  

ScheduledExecutorService不会导致后台进程多次运行吗?

没有。后台进程将运行一次。还将创建ScheduledExecutorService创建的Futures,然后在预定的时间运行。

  

例如,当延迟小于上一次迭代运行所花费的时间时会发生什么?

将创建多个期货并开始同时运行。

  

我应该使用Thread.Sleep()在doInBackground()中使用while循环吗?

根据我们对您当前项目的了解,我们很难说出来。这可能有用,是的,但是对于更复杂的需求,那么不,你会想要使用ScheduledExecutorService。

答案 1 :(得分:0)

我通常在swingworker中使用一个循环,工作正常。

全局变量

private boolean monitor = true;

Swingworker Class

private class MonitorQueue extends SwingWorker<Void, Void> {

    @Override
    protected Void doInBackground() throws Exception {
        while (monitor) {
            System.out.println("monitor");
            Thread.sleep(Constants.SECOND * 5);
        }
        return null;
    }
}

我增加了优势,而不是停止或暂停SwingWorker本身,我只设置了monitor = false。这将让SwingWorker在停止之前完成所有任务。