【发布时间】:2010-12-09 07:07:38
【问题描述】:
很确定所有这些方法都行得通,但我希望能就哪种方法最好提出意见。
考虑一下(不幸的)场景,您有 UI 更改代码和合理密集(平均 500 毫秒)的逻辑代码混合且不可分割。所有不断变化的 ui 组件都在一个面板上。
01 new Thread(){
02 public void run(){
03
04 for (int i = 0; i < 100; i++){
05 // some processing
06 doSomething();
07 // update some ui components
08 panel.doSomeUi();
09 }
10
11 panel.revalidate();
12 panel.repaint();
13
14 }}.start();
您会选择以下 3 种方法中的哪一种?为什么?
- 将所有代码封装在invokeLater中
- 在 doSomeUi() 中调用 invokeLater,然后再次调用以进行重新验证/重新绘制
- 仅在最后使用 invokeLater 进行重新验证/重新绘制
对于我来说:
选项 1 会在所有处理发生时挂起事件处理线程 (EPT)
选项 2 在创建许多新的可运行文件时会考虑开销,并且在特殊情况下,如果组件需要一些后续的 ui 更改才能生效,则可能会导致 ui 更新为半完成状态
选项 3 将是最有效的,但可能存在一些线程安全问题
热衷于听取其他意见。
【问题讨论】: