java - Thread.join() 未按预期工作

标签 java multithreading swing

我正在使用线程重新绘制 JPanel(因为 repaint() 是线程安全的)。

这是paintComponent方法:

    public void paintComponent(Graphics g) {
    super.paintComponent(g);
    //Print statement so I know where my program is at.
    System.out.println("Repainting world...");
    g.drawImage(worldImage, x, y, 6144, 4608, null);
}

每当用户按下某个按钮时,我就有一个线程在 KeyListener 内部启动

运行方法:

public void run(){
                game.repaint();
}

最后,这是我对使用上述 run 方法的线程的调用:

//NOTE: I've tried this without the if statement, made no difference
if(!gameThread.isAlive()){
    gameThread.start();
    try {
            gameThread.join();
    } catch (InterruptedException e) {
            e.printStackTrace();
    }
}

我非常确定,在这种情况下(因为它位于 KeyListener 中)Thread.join() 会停止 EDT直到执行该 run 方法。

问题是,每当我再次按下按钮时,无论我等待多久,Thread.join都会抛出一个InterruptedException。这让我相信它在某个区域挂起,线程不会停止它的执行。我只是不知道它可能卡在哪里。

最佳答案

如果我理解这一点...您正在从游戏线程中调用 repaint() 。由于 repaint() 在 EDT 上执行,我认为您已经阻止了它的执行,因为 gameThread.join() 阻止了 EDT(因为它是由 EDT 启动的,即从您的 KeyListener 处理程序中启动)。

关于java - Thread.join() 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30037646/

相关文章:

java - 从服务器端的 # 片段获取 OAuth 2.0 访问 token

java - 这是对 Java 中字符串不变性的妥协吗?

java - 单元测试Springboot MockMvc返回403 Forbidden

c - 将 pthread_mutex_t 传递给函数

java swing setXXXSize() 替代方案?

java - 如何在JDOM中写入xml属性值?

c++ - 使用 cudaSetDeviceFlags 的正确位置?

java - 防止并发回调代码运行两次

java - 如何防止 TrayIcon 弹出窗口占用整个调度程序线程

java - 显示全分辨率图像的动画 Swing 效果