Java 8u161/8u162 使 Swing 应用程序使用 CPU

标签 java swing

当在 8u161 或 8u162 上运行 Swing 应用程序并且焦点在 JTextField 中并且您切换到另一个应用程序(如 Chrome)并返回该应用程序时,我的 8 核 Windows 10 PC 上的 CPU 使用率增长到 15%(好像整个核心都在忙于处理事件)。

只需运行应用程序并切换几次。 如果我单击选项卡式 Pane 中的选项卡,CPU 使用率会按预期下降到 0。

public class Test {
  public static void main(String... args) {
    SwingUtilities.invokeLater(() -> {
      JFrame f = new JFrame("Test");
      JTabbedPane tp = new JTabbedPane();
      tp.addTab("tab 1", new JTextField(20));
      f.add(tp);
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      f.pack();
      f.setLocationRelativeTo(null);
      f.setVisible(true);
    });
  }
}

我试图查看事件队列以查看发生了什么,它看起来很像最后一个事件被一次又一次地处理

如果我将它添加到上面的程序中,我会得到很多 java.awt.event.InvocationEvent[INVOCATION_DEFAULT,runnable=sun.awt.windows.WInputMethod ...

Toolkit.getDefaultToolkit().getSystemEventQueue().push(new EventQueue(){
  @Override protected void dispatchEvent(AWTEvent event) {
    System.out.println(event);
    super.dispatchEvent(event);
  }
});

在 8u151、8u152 和 9.0.4 上工作正常

我有很多升级到 161 的客户遇到了这个问题,所以非常感谢任何解决方法的建议。 I have filed a bug with Oracle

JProfiler 显示: enter image description here

似乎在 8u172 b02 上工作正常

根据 openjdk这是由 8184016 介绍的并由 8183504 修复

最佳答案

您的客户是否使用输入法?如果您不需要启用输入法,我建议您可以禁用它。

public class Test {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
              JFrame f = new JFrame("Test");
              JTabbedPane tp = new JTabbedPane();
              JTextField tf = new JTextField();
              tf.enableInputMethods(false); // disable IM
              tp.addTab("tab 1", tf);
              f.add(tp);
              f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              f.pack();
              f.setLocationRelativeTo(null);
              f.setVisible(true);
            }
        });
    }
}

关于Java 8u161/8u162 使 Swing 应用程序使用 CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48339199/

相关文章:

java - RabbitMQ - 根据不同的条件调用不同的实现

java - 为 java 桌面应用程序设置 IDE(eclipse)

Java HTMLDocument(insertAfterEnd、insertAfterStart、insertBeforeEnd、insertBeforeStart)不工作?

java - Liferay 7 - 创建经典主题的子主题

java - 关于为基于 Servlet 的 Java Web 应用程序设置负载平衡和故障转移的书籍/资源

Java后台 worker : Scope of Widget to be updated unclear

java - 为什么事件没有发布到 AWT EventQueue?

java - JTable - 按 Tab 键让单元格进入编辑模式

java - Spring Boot中通过读取文件进行操作

java - Java中使用super()?