gpt4 book ai didi

java - 使用invokeLater

转载 作者:行者123 更新时间:2023-12-02 00:54:12 26 4
gpt4 key购买 nike

很确定所有这些方法都会起作用,但我很乐意就哪种方法最好提出意见。

考虑一下(不幸的)场景,您有 UI 更改代码和相当密集(平均 500 毫秒)的逻辑代码混合在一起并且不可分割。所有变化的用户界面组件都在一个面板上。

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 种方法中的哪一种?为什么?

  1. 将所有代码包装在invokeLater中
  2. 在 doSomeUi() 内调用 invokeLater,然后再次进行重新验证/重绘
  3. 仅在结束时使用 invokeLater 进行重新验证/重绘

对于我的:

选项 1 将在所有处理发生时挂起事件处理线程 (EPT)

选项 2 会考虑创建许多新的可运行对象的开销,并且在特殊情况下,如果组件需要一些后续 ui 更改才能生效,则可能会导致 ui 以半完成状态更新

选项 3 是最有效的,但可能存在一些线程安全问题

渴望听到其他意见。

最佳答案

doSomeUi () some 应该包含在 invokeLater () 中并且应该触发任何必要的重绘/重绘——Swing UI 线程将在您继续计算时进行绘制。

在现代虚拟机上创建大量短暂的 Runnable 的开销很小,并且不应该成为问题。

因此,应该选择选项 2(经过建议的修改)。编写多线程代码时,缓慢且正确的代码总是比快速且随机出现错误的代码要好。

关于java - 使用invokeLater,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1610598/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com