我正在使用一个线程重新绘制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
。这让我相信它会被某个地方挂在一个区域,线程不会阻止它的执行。我无法分辨它可能会被挂断的地方。
答案 0 :(得分:1)
如果我明白这一点......你在gameThread中调用repaint()。由于repaint()在EDT上执行,我认为你已经阻止它执行,因为gameThread.join()阻止了EDT(因为它是由EDT启动的,即从你的KeyListener处理程序中启动)。