2013-02-10 39 views
0

在我的pong遊戲中,每個對象(球和兩個槳)都在獨立線程中運行。程序拋出IllegalThreadStateException

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和遊戲沒有按不會繼續。 什麼問題?它不停止線程?

+0

爲什麼需要使用三個獨立的線程? – 2013-02-10 12:36:16

+0

因爲我想獨立控制所有對象。 – lapots 2013-02-10 12:40:11

+0

如果你有200個遊戲對象,你會使用200個線程嗎?什麼阻止你從一個線程控制多個對象?也許我不明白「獨立控制所有對象」的含義。 – 2013-02-10 12:43:39

回答

3

要繼續比賽 - 我重新啓動所有線程...

不能重新啓動Java線程。爲Thread.start()該國的Javadoc:

「這是從來沒有的法律,以啓動一個線程不止一次特別是,一個線程可能無法一旦完成執行重新啓動。」

「拋出:IllegalThreadStateException - 如果線程已經啓動。」

您需要可以創建新的線程對象,並啓動它們,或者想出一些方法來告訴現有的線程進入一個應用程序定義的「暫停」狀態,當他們被中斷,並等待,直到他們告訴「恢復」。

+0

即使當我重新啓動線程continueGame'ball = new Thread(b); ball.start();'它仍然拋出'IllegalThreadStateException'。 – lapots 2013-02-10 12:46:15

+0

我希望你做得不對。只有在**之前**啓動線程時才拋出異常。 – 2013-02-10 12:48:55

+0

當我按下按鈕'startGame' - '球時,我開始線程。啓動()'。當我按下ESC - 'ball.interrupt(); ball.join();'。當我再次按ESC時 - 'ball = new Thread(b); ball.start();'。另外,我在'b'對象中實現了'Thread.sleep(8)'(它實現'Runnable')。就是這樣。 – lapots 2013-02-10 12:51:35

1

線程終止後不允許再次啓動。從文檔:

「多次啓動一個線程永遠不合法,特別是一旦線程完成執行,它可能不會重新啓動。」

創建線程的新實例並啓動它是合法的。但是,這不會實現「暫停」效果,除非您確保提供給新線程的狀態準確地表示暫停狀態。

相關問題