在我的乒乓球比赛中,每个对象(球和两个拨片)都在独立线程中运行。
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 :(得分:3)
在线程停止/中断后无法重新启动线程。但是没有什么可以阻止你创建新线程并启动它。
答案 1 :(得分:3)
继续游戏 - 我重启所有线程......
您无法重新启动Java线程。 Thread.start()
的javadoc说明了这一点:
“不止一次启动一个线程是不合法的。特别是,一旦完成执行,线程可能无法重启。”
“抛出:
IllegalThreadStateException
- 如果线程已经启动。”
你需要创建新的线程对象并启动它们,或者找出一些方法告诉现有线程在被中断时进入应用程序定义的“暂停”状态,然后等待它们被告知“恢复” ”
答案 2 :(得分:1)
终止后不允许再次启动线程。来自文档:
“不止一次启动一个线程是不合法的。特别是,一旦完成执行,线程可能无法重启。”
创建线程的新实例并启动它是合法的。但是,这不会达到“暂停”效果,除非您确保提供给新线程的状态准确表示暂停状态。