Uri*_*Uri 6 java performance swing multithreading
在过去的几年里,我主要在Eclipse中完成UI开发,在线程访问方面非常保守:任何尝试从UI线程外部更改UI小部件上的属性(例如,颜色,文本)都会引发异常.
我现在正在查看Swing中的一个现有程序,它有一个包含大量自定义小部件的窗口.有一个单独的线程为每个小部件运行一个变异函数,并且变异函数读取某些东西的值(例如,标签颜色和值)并写入一些(例如,更改背景颜色).请注意,没有涉及自定义绘画或类似的东西,只是对它包含的子窗口小部件的一些更改,主要是JLabel.
目前,这是从单独的线程运行,而不是从Swing事件线程运行.这个线程覆盖了所有400个小部件,并在每个小部件上调用mutator.更新似乎正常工作,但GUI没有响应用户输入.
如果我从Swing线程外部运行大约0.4毫秒并将每个调用包装到invokeLater或invokeAndWait中的mutator,那么UI响应速度要快得多.
我想要了解的是:
1)从Swing线程外部进行所有这些调用有时是否合法?
2)对Swing线程的影响是什么?当我从外面调用它时,为什么UI响应性较差?
从“什么都没有”到间歇性问题,再到“一切都坏了,让每个人都开始在 GUI 上工作!”
主要(最明显)的视觉效果是,如果您暂停 GUI 线程(就像有人按下按钮,然后您执行 sleep(5000) 或其他操作),您的 GUI 将不会重新绘制。它不能,因为你抓住了唯一允许它通过你的线程!这让人觉得Java真的很慢。这还不错,但它很容易编程,以至于很多不费心去研究这样的实践的人已经生产出了运输产品。
下一个最大的问题是,当您在另一个线程中绘制屏幕时(例如传递给主线程的线程),它可能会出现奇怪的行为。Swing 对渲染帧的方式已经太挑剔了——将线程作为变量!
最后,很少(或者经常是,如果您在错误的线程上的紧密循环中调用 swing 组件),您可能会遇到线程冲突。如果发生这种情况,可能会抛出(或不抛出)异常,并且可能会出现错误,但可能并不明显。