我有一个Console-Java游戏。游戏中的分数将被保存在一个JSON文件中,如果 Ctrl+C
被按下。将分数保存在JSON文件中的过程是可行的。但是我不知道,如何检测到 Ctrl+C
如果发生这种情况,我将保存分数(只是一个方法调用)。KeyListener 它在控制台上不工作(只有在使用了 JFrame 据我所知)。)
我在网上找不到解决我问题的方法。
我必须用 运行时? 我已经试过了,但没有用...
Runtime.getRuntime().addShutdownHook(new Thread()
{
public void run()
{
Test.mainThread.interrupt();
}
});
在Stackoverflow上也有类似的问题,但不是在控制台使用的问题 在Java中捕获Ctrl+C
增加一个关机钩子是正确的方法,但 Test.mainThread.interrupt();
可能不会工作。 JVM已经在关闭了,你的mainThread不可能有时间响应一个中断。 你的mainThread不太可能有时间响应一个中断;一旦所有的shutdown hooks完成,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();
}
}
});
我们知道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,而是传递线程,以便以后中断它。但最好是在业务层面进行操作。