如何让swingutilities.invokelater更快地执行任务?

jfewjypa  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(268)

我使用swingutilities.invokelater来更新ui。有时任务几乎是在调用invokelater时立即执行,但有时需要几秒钟,这是我希望避免的。有什么设置可以帮我解决这个问题吗?
我知道任务是在awt事件调度线程中执行的,但是有没有办法强制清除队列(可能不是一个好主意),或者以某种方式添加另一个awt线程来并行工作,或者其他任何有助于更快执行任务的解决方案?
是否有可能影响这些事情,或者我所能做的只是自己创建一些守护进程线程?我想避免这样。

von4xj4u

von4xj4u1#

你试过了吗 SwingUtilities.invokeAndWait() ? 听起来你不想让程序做其他与swing操作相关的事情,你想现在就做。
当然,这实际上不会导致它们在更少的cpu周期内完成,如果已经有东西排队等待调度线程,那么这并不能消除它们或任何东西。
还有一些事情,比如从文件中加载图像,可以同步或异步完成——如果您试图消除暂停,您可以确保这些都是您想要的。

dm7nw8vv

dm7nw8vv2#

有些事情必须在事件处理程序线程上完成。swing不是线程安全的,不遵循这个规则会导致奇怪的事情发生。
因为只有一个这样的线程(并且您不能创建其他线程),所以请确保它只用于必要的事情。所以,不要在那个线程上做复杂的计算。检查您的 paintComponent() 方法, invokeLater() 呼叫等耗时零件。
要么优化它们的性能,要么将它们重构为其他“工作线程”。您可以拥有任意数量的工作线程,只要它们不调用swing方法。你问的事实 invokeLater() 意味着除了事件处理程序之外,您至少已经在使用一个线程。
在这个过程中,一个好的分析工具会很有帮助。

相关问题