使用超时异常时java中的计时器问题,超时异常后代码无法正常运行

时间:2016-03-11 16:19:26

标签: java timer exception-handling timeoutexception

我在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后开始新游戏无法正常工作?

1 个答案:

答案 0 :(得分:0)

  

我可能需要在计时器方法中关闭一些东西吗?它几乎就像它仍在背景中运行。

如果不在执行程序上调用shutdown,则执行程序创建的工作线程将会挂起。 (这与您声明执行程序的范围无关。)如果它是非守护程序线程,那么它将使旧JVM保持活动状态。

此外,您的任务需要响应中断。请参阅shutdownNow的文档:

  

除了尽力尝试停止处理主动执行任务之外,没有任何保证。例如,典型的实现将通过Thread.interrupt()取消,因此任何无法响应中断的任务都可能永远不会终止。

“响应中断”意味着检查Thread.currentThread().isInterrupted()以查看线程是否已被取消然后对其进行操作(找到停止位置,进行清理并退出run方法),并恢复中断的标志( Thread.currentThread().interrupt())如果捕获到InterruptedException或InterruptedIOException。