1

我有一个控制台 Java 游戏。Ctrl+C如果按下,游戏得分将保存在 JSON 文件中。将分数保存在 JSON 文件中的过程有效。但我不知道,如何Ctrl+C从控制台检测,如果发生这种情况,我会保存分数(只是一个方法调用)。使用KeyListener它在控制台上不起作用(据我所知,只有JFrame )。

我在互联网上找不到我的问题的解决方案。

我必须用Runtime来做吗?我试过了,但是没有用...

Runtime.getRuntime().addShutdownHook(new Thread()
{
    public void run()
    {
        Test.mainThread.interrupt();
    }
});

Stackoverflow 上有类似的问题,但不适用于控制台Catching Ctrl+C in Java

4

2 回答 2

0

添加关闭挂钩是正确的方法,但Test.mainThread.interrupt();可能行不通。JVM 已经关闭。您的 mainThread 不太可能有时间响应中断;一旦所有关闭挂钩完成,Java 就会终止。

只需让您的关闭挂钩明确执行您需要采取的任何操作:

Runtime.getRuntime().addShutdownHook(new Thread()
{
    @Override
    public void run()
    {
        try
        {
            Test.saveScore();
        }
        catch (IOException e)
        {
            System.err.println("Couldn't save score before terminating.");
            e.printStackTrace();
        }
    }
});
于 2020-05-16T13:08:57.223 回答
0

我们知道 CTRL-C 关闭应用程序并关闭 JVM。而且由于它是正常关机,它运行关机钩子。所以创建一个关闭钩子是一个正确的方法:

Runtime.getRuntime().addShutdownHook(new Thread(() -> {
    // Do something to save the score 
}));

请注意,我们在Runnable这里传递了一个作为关闭任务。所以我们可以传递一个具有所需功能的对象:

Runtime.getRuntime().addShutdownHook(new Thread(() -> {
    gameScores.save(); // assuming we have a gameScores object in this scope
}));

您通过中断线程的初始尝试可以被视为这种方法的一种变体。我们可以传递线程以稍后中断它,而不是传递业务对象 - gameScores。但最好是在业务层面上进行操作。

于 2020-06-02T14:31:14.867 回答