0

私の卓球ゲームでは、すべてのオブジェクト (ボールと 2 つのパドル) が独立したスレッドで実行されています。

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

ゲームを続行するには-すべてのスレッドを再起動します...

Javaスレッドを再起動することはできません。のjavadocは、次のようにThread.start()述べています。

「スレッドを複数回開始することは決して合法ではありません。特に、実行が完了したスレッドは再起動されない場合があります。」

「スロー:IllegalThreadStateException-スレッドがすでに開始されている場合。」

新しいスレッドオブジェクトを作成して開始するか、既存のスレッドが中断されたときにアプリケーション定義の「一時停止」状態に入るように指示し、「再開」するように指示されるまでそこで待機する方法を見つける必要があります。

于 2013-02-10T12:35:30.023 に答える
3

スレッドが停止または中断された後、スレッドを再開することはできません。しかし、新しいスレッドを作成して開始することを止めるものは何もありません。

使用できるいくつかのオプションをリストするSOの回答

于 2013-02-10T12:35:29.660 に答える
1

スレッドは、終了後に再開することはできません。ドキュメントから:

「スレッドを複数回開始することは決して合法ではありません。特に、実行が完了したスレッドは再起動されない場合があります。」

スレッドの新しいインスタンスを作成して開始することは合法です。ただし、新しいスレッドに提供される状態が一時停止状態を正確に表していることを確認しない限り、これは「一時停止」効果を実現しません。

于 2013-02-10T12:37:37.153 に答える