gpt4 book ai didi

java - 在 Java 中重复执行 SwingWorker

转载 作者:行者123 更新时间:2023-11-29 07:54:39 25 4
gpt4 key购买 nike

我通读了多篇文章,但未能找到我的问题的明确答案。

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

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

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

提前谢谢你。

最佳答案

您只能运行一次 SwingWorker,无一异常(exception)。可能的解决方案包括:

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

关于您的声明,

What I want to do is when the user presses "Start", the SwingWorker starts execution, sleeps for a few minutes and then re-runs the same task. When the "Stop" button is pressed, everything stops.

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


编辑
您的评论和我的回复:

Wouldn't a ScheduledExecutorService cause the background process to run multiple times?

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

What would happen, for example, when the delay is less than the time it took the previous iteration to run?

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

Should I just go with a while loop inside the doInBackground() with a Thread.Sleep()?

根据我们对您当前项目的了解,很难判断。是的,这可能会起作用,但是对于更复杂的需求,则不,您会想要使用 ScheduledExecutorService。

关于java - 在 Java 中重复执行 SwingWorker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18706981/

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