相关疑难解决方法(0)

其他线程中的繁忙循环延迟了EDT处理

我有一个Java程序,它在一个单独的(非EDT)线程上执行紧密循环.虽然我认为Swing UI仍然应该响应,但事实并非如此.下面的示例程序显示了问题:单击"试用我"按钮应该在大约一半时间后弹出一个对话框,并且应该可以通过单击其任何响应立即关闭该对话框.相反,对话框需要更长的时间才能显示,并且/或者在单击其中一个按钮后需要很长时间才能关闭.

  • Linux(两台具有不同发行版的不同计算机),在Windows上,在Raspberry Pi(仅限服务器VM)和Mac OS X上(由另一个SO用户报告)出现问题.
  • Java版本1.8.0_65和1.8.0_72(两者都试过)
  • i7处理器有很多核心.EDT应该有足够的备用处理能力.

有没有人知道为什么EDT处理被延迟,即使只有一个繁忙的线程?

(请注意,尽管Thread.sleep呼叫的各种建议是导致问题的原因,但事实并非如此.它可以被移除,问题仍然可以重现,尽管它表现得稍微不那么频繁并且通常表现出上述第二种行为 - 即非- 响应JOptionPane对话而不是延迟对话框出现.此外,没有理由睡眠调用应该屈服于另一个线程,因为如上所述的备用处理器核心 ; EDT可以在调用后继续在另一个核心上运行sleep).

import java.awt.EventQueue;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class MFrame extends JFrame
{
    public static void main(String[] args)
    {
        EventQueue.invokeLater(() -> {
            new MFrame();
        });
    }

    public MFrame()
    {
        JButton tryme = new JButton("Try me!");

        tryme.addActionListener((e) -> {
            Thread t = new Thread(() -> {
                int a = 4;
                for (int i = 0; i …
Run Code Online (Sandbox Code Playgroud)

java swing multithreading

9
推荐指数
1
解决办法
947
查看次数

标签 统计

java ×1

multithreading ×1

swing ×1