0

在我的乒乓球比赛中,每个对象(球和两个球拍)都在独立线程中运行。

static Ball b = new Ball(195, 145);

Thread ball = new Thread(b);
Thread paddle1 = new Thread(b.paddle1);
Thread paddle2 = new Thread(b.paddle2);
public void startGame(){
    gameStarted = true;
    ball.start();
    paddle1.start();
    paddle2.start();
}

当我按下 ESC 并再次按下 ESC 时,我想将游戏设置为暂停 - 继续游戏。所以在 keyPressed 事件中我已经这样做了

 if (e.getKeyCode() == KeyEvent.VK_ESCAPE){
            if (gameStarted) {
                gameStarted = false;
                ballCurrentX = b.x; //save all states
                ballCurrentY = b.y;
                ballXDirection = b.xDirection;
                ballYDirection = b.yDirection;
                p1Score = b.p1Score;
                p2Score = b.p2Score;
                p1CurrentY = b.paddle1.y;
                p2CurrentY = b.paddle2.y;
                try {
                    ball.interrupt();
                    ball.join();
                    paddle1.interrupt();
                    paddle1.join();
                    paddle2.interrupt();
                    paddle2.join();
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }   
            }
            else {
                gameStarted = true;
                continueGame();
            }
        } 

继续游戏 - 我重新启动所有线程,但为之前游戏状态的对象设置参数

public void continueGame(){
    gameStarted = true;
    b = new Ball(ballCurrentX, ballCurrentY);
    b.xDirection = ballXDirection;
    b.yDirection = ballYDirection;
    b.p1Score = p1Score;
    b.p2Score = p2Score;
    b.paddle1.y = p1CurrentY;
    b.paddle2.y = p2CurrentY;
    ball.start();
    paddle1.start();
    paddle2.start();
}

但程序抛出IllegalThreadStateException,游戏无法继续。有什么问题?它不会停止线程吗?

4

3 回答 3

3

线程停止/中断后,您无法重新启动它。但是没有什么能阻止你创建一个新线程并启动它。

一个 SO 答案,列出了您可以使用的一些选项

于 2013-02-10T12:35:29.660 回答
3

继续游戏 - 我重新启动所有线程......

您不能重新启动 Java 线程。javadoc forThread.start()说明了这一点:

“多次启动一个线程是不合法的。特别是,一个线程一旦完成执行就可能不会重新启动。”

“抛出:IllegalThreadStateException- 如果线程已经启动。”

您需要创建新的线程对象并启动它们,或者想办法告诉现有线程在被中断时进入应用程序定义的“暂停”状态,并在那里等待直到它们被告知“恢复”。

于 2013-02-10T12:35:30.023 回答
1

线程被终止后不允许再次启动。从文档中:

“多次启动一个线程是不合法的。特别是,一个线程一旦完成执行就可能不会重新启动。”

创建线程的新实例并启动它是合法的。但是,这不会达到“暂停”的效果,除非您确保提供给新线程的状态准确地表示暂停状态。

于 2013-02-10T12:37:37.153 回答