如果违反了Swing的线程策略,该怎么办?

表演:

在过去的几年中,我主要在Eclipse中进行UI开发,这在线程访问方面非常保守:从UI线程外部更改UI小部件上的属性(例如颜色,文本)的任何尝试都会引发异常。 。

我现在正在查看Swing中的现有程序,该程序具有一个带有大量自定义小部件的窗口。有一个单独的线程为每个小部件运行一个变异函数,变异函数读取某些事物的值(例如,标签颜色和值),并写入某些事物的值(例如,更改背景颜色)。请注意,没有涉及自定义绘画或类似的东西,只是对其包含的子窗口小部件进行了一堆更改,其中大部分是JLabel。

目前,这是从单独的线程运行的,而不是从Swing事件线程运行的。该线程遍历所有400个小部件,并在每个小部件上调用mutator。更新似乎可以正常工作,但是GUI对用户输入无响应。

如果我把整个事情(从Swing线程外部运行大约0.4毫秒)并把对mutator的每个调用包装在invokeLater或invokeAndWait中,则UI的响应速度要快得多。

我想了解的是:

1)从Swing线程外部进行所有这些调用有时合法吗?

2)对Swing线程有什么影响?为什么当我从外面调用UI时,UI的响应性降低?

比尔K:

从“什么都没有”到间歇性问题,再到“一切都破了,请所有人开始使用GUI!”

主要的(最明显的)视觉效果是,如果您按住GUI线程(例如有人按下按钮并进行了sleep(5000)或其他操作),则GUI将不会重新绘制。不能,因为您坚持使用唯一允许通过的线程!这使人们认为Java确实很慢。不错,但编程很容易,许多不愿意像这样研究实践的人生产了运输产品。

下一个最大的问题是,当您在另一个线程(如传递给main的线程)中绘制屏幕时,它可能具有奇怪的行为。Swing对于如何渲染框架已经太挑剔了-将线程作为变量删除!

最后,很少(或者经常(如果您在错误的线程上紧密循环中调用一个swing组件))会发生线程冲突。如果发生这种情况,可能会引发(或不引发)异常,并且可能会导致错误,但这可能并不明显。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章