我在java中设计一款类似于棋盘游戏的游戏。在实施中,还存在称为速度模式的模式,其中如果玩家在时间限制(5秒)内没有转弯,则另一个玩家将获胜。这种模式通常也可以赢得"捕获"反对派。满足以下任一条件后,将从主菜单再次运行游戏。当通过捕获满足获胜条件时,这在正常模式和速度模式下工作正常。如果它在时间耗尽时赢了,但它表现得非常奇怪,几乎随机地提示输入和打印。
时间的代码如下:
public Boolean speedMode(Player player, Player opponent) {
ExecutorService service = Executors.newSingleThreadExecutor();
try {
Runnable r = new Runnable() {
Boolean outOfRange;
public void run() {
do {
outOfRange = takeTurn(player);
} while (outOfRange == true);
}
};
Future<?> f = service.submit(r);
f.get(5, TimeUnit.SECONDS);
} catch (final InterruptedException e) {
System.out.println("The thread was interrupted during sleep, wait or join");
} catch (final TimeoutException e) {
player.setWon(false);
System.out.println("\n" + player.getName() +", you took too long... ");
return true;
} catch (final ExecutionException e) {
System.out.println("An exception from within the Runnable task");
}
return false;
}
当TimeoutException发生时,oppisite玩家获胜,而循环显示beow退出并打印正确的祝贺。问题是当它在奇怪的行为开始时在代码的底线开始新游戏。有没有什么我需要在计时器方法中关闭?它几乎就像它仍然在后面运行。
else {
do {
timeOut = speedMode(second, first);
if(winCheck1(first) == true || timeOut == true){
break;
}
timeOut = speedMode(first, second);
} while (winCheck1(second) != true && timeOut != true);
if(player1.isWon() == true){
System.out.println("\n\nCongratulations " + player1.getName() + " you are the winner!\n\n");
}
else{
System.out.println("\n\nCongratulations " + player2.getName() + " you are the winner!\n\n");
}
}
//reload the menu
Game game = new Game();
}
基本上我的问题是;任何人都可以告诉我为什么在抛出TimeoutException后开始新游戏无法正常工作?
答案 0 :(得分:0)
我可能需要在计时器方法中关闭一些东西吗?它几乎就像它仍在背景中运行。
如果不在执行程序上调用shutdown,则执行程序创建的工作线程将会挂起。 (这与您声明执行程序的范围无关。)如果它是非守护程序线程,那么它将使旧JVM保持活动状态。
此外,您的任务需要响应中断。请参阅shutdownNow的文档:
除了尽力尝试停止处理主动执行任务之外,没有任何保证。例如,典型的实现将通过Thread.interrupt()取消,因此任何无法响应中断的任务都可能永远不会终止。
“响应中断”意味着检查Thread.currentThread().isInterrupted()
以查看线程是否已被取消然后对其进行操作(找到停止位置,进行清理并退出run方法),并恢复中断的标志( Thread.currentThread().interrupt()
)如果捕获到InterruptedException或InterruptedIOException。