Swing的定时器中,“quick”的含义是什么?

14

来自Java教程:

请注意,Swing计时器的任务在事件分派线程中执行。这意味着任务可以安全地操作组件,但也意味着任务应该快速执行。如果任务可能需要一段时间才能执行完毕,则考虑使用SwingWorker替代或补充计时器。

"快速"是什么意思?我的意思是不精确的,少于一分钟算快吗?

例如,如果我想制作一个动画(1分钟),通过移动它们,改变它们的透明度等方式使用一些面板,并且用户只会看到面板,不会与它们一起工作(没有I / O),现在计时器对于这种情况是否是一个好主意?


3
如果20毫秒经常运行,那么它是可以被察觉的。 - assylias
5
我的经验法则是:你不应该在EDT上等待IO操作。你可以发起IO操作并检查结果是否已经返回,但是调用阻塞式的IO方法(如从磁盘读取、等待数据库结果等)时,不应该在Swing线程上执行。CPU密集型任务通常会较快完成,但当然也有例外情况。 - Joachim Sauer
3个回答

12

这只是意味着 - 它应该是快速的,就像 - 几乎没有明显的延迟。

然而,在页面的后面,他们说如果您有一个复杂和并发的应用程序,请查看 SwingWorker 类,并了解与 swing 相关的 并发

问题不一定是每件事情运行得多快,而是它在正确的顺序中。

在 SwingWorker 中,您将了解到多线程 Swing 应用程序中存在两个主要问题:

  • 不应在事件分派线程上运行耗时任务。否则应用程序会变得无响应。

    Swing 组件应该仅在事件分派线程上访问。


2
上面我解释的情况怎么样? - Soheil

8
为了回答你的具体问题:
如果我想制作一个动画(1分钟),通过移动它们,改变它们的透明度等方式来操作一些面板,并且用户只会看到这些面板而不会与它们交互(没有输入/输出),那么计时器是否是这种情况下的好选择?
是的,平滑动画需要使用计时器。
假设您想要每秒显示40个帧。这意味着您有25毫秒的时间来准备和显示每个面板。
显然,您可以将更多的计算移出动画循环,这样效果更佳。在现代个人电脑上渲染一个面板只需要几毫秒。计算面板可能需要超过25毫秒的时间。
因此,对于一分钟的动画,您需要2400个面板。预先计算这些面板并仅对其进行渲染将导致更平滑的动画。

6
在此上下文中,快速没有固定的时间限制。但是,您应该假定任何需要几十毫秒以上时间的任务通常都不被视为快速。请注意,运行在EDT上的任何代码都可能会对应用程序的GUI产生各种问题。因此,文档建议您改用SwingWorker
这也取决于您的Timer的延迟。如果它每50ms运行一次,则运行30ms的任务过于缓慢。然而,如果您的任务每5-10分钟运行一次,仅需30ms,则可以接受。您将需要运行一些测试,以查看您的Timer是否对您的应用程序产生任何可见影响。
有关EDT的更多信息,请参阅此文章。此答案提供了许多有关如何使用SwingWorker对象的信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接