我正在使用线程重新绘制 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/