【发布时间】:2010-11-28 14:49:41
【问题描述】:
在过去的几年中,我主要在 Eclipse 中完成 UI 开发,这在线程访问方面非常保守:任何从 UI 线程外部更改 UI 小部件属性(例如颜色、文本)的尝试抛出异常。
我现在正在查看一个现有的 Swing 程序,它有一个带有大量自定义小部件的窗口。有一个单独的线程为这些小部件中的每一个运行一个突变函数,突变函数读取一些东西的值(例如,标签颜色和值)并写入一些(例如,更改背景颜色)。请注意,没有涉及自定义绘画或类似的东西,只是对其包含的子小部件进行了一堆更改,这些小部件主要是 JLabel。
目前,它从单独的线程运行,而不是从 Swing 事件线程运行。该线程遍历所有 400 个小部件并在每个小部件上调用 mutator。更新似乎工作正常,但 GUI 对用户输入没有响应。
如果我从 Swing 线程外部运行大约 0.4 毫秒的整个过程,并将对 mutator 的每个调用包装在 invokeLater 或 invokeAndWait 中,那么 UI 的响应速度就会快得多。
我想了解的是:
1) 从 Swing 线程外部进行所有这些调用有时是否合法?
2) 对 Swing 线程有什么影响,为什么当我从外部调用它时 UI 响应较慢?
【问题讨论】:
标签: java performance multithreading swing