Thread.join()无法按预期工作

时间:2015-05-04 18:45:27

标签: 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。这让我相信它会被某个地方挂在一个区域,线程不会阻止它的执行。我无法分辨它可能会被挂断的地方。

1 个答案:

答案 0 :(得分:1)

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