【发布时间】:2018-10-04 00:52:01
【问题描述】:
我不知道如何精确地使用SwingUtilities.invokeLater,但是在我的应用程序中,面板在不同的Runnables 中运行,而swingUtilities.invokeLater 在参数中接受Runnables,但是如果我在swingUtilities 的线程中放置一个线程。 invokeLater,它会在“SwingUtilities 线程安全的 AWT/Swing 概念”中工作吗?我可以放多于 1 个线程吗?因为我有面板/线程可以在 1 个 JFrame 内运行。
【问题讨论】:
-
不确定您的面板在不同线程中运行是什么意思。这没有道理。有一个事件调度程序线程处理所有事件和图形响应。 'invokeLater' 将事件添加到该线程,即在您在任意线程中完成长任务后,您通过调用正确(短)更新命令与 invokeLater 来通知 gui 组件进行更新。它们将被添加到事件队列的末尾。
-
您对
invokeLater的作用感到困惑。它确实不将 Thread 作为参数,而是采用 Runnable,并将其排队到 Swing 事件线程以在该单个事件线程上运行。如果您想做后台线程,请使用 SwingWorker,并在需要时创建多个工作人员。请阅读Lesson: Concurrency in Swing 以更好地理解这一点。 -
另外,您的问题缺乏必要的细节和代码,如果没有您的改进,很难给您一个具体的答案。请查看How to Ask,了解更多关于如何提出体面问题的信息。
-
你真的想看看Concurrency in Swing - Swing 是单线程的,不是线程安全的。你不应该从事件调度线程的上下文之外修改 UI(直接或间接)
-
"CountDownLatch 我在 invokeLater 中“阻塞接口”" - 如果您在 EDT 的上下文中运行
CountDownLatch- 那么是的,我想象它会阻塞用户界面
标签: java multithreading swing swingutilities