gpt4 book ai didi

Java 控制台程序和 CTRL-C

转载 作者:行者123 更新时间:2023-11-29 06:15:49 25 4
gpt4 key购买 nike

import java.util.Scanner;

public class test {
public static void main(String[] args) {

Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
System.out.println("Shutdown.");
}
});

String input ="";
Scanner in = new Scanner(System.in);

while(true) {
System.out.print("> ");
// if (in.hasNext())
input = in.nextLine();

if (input.equalsIgnoreCase(""))
continue;
}
}
}

我有这个简单的控制台程序,我正在尝试实现 Ctrl-C 以简单地退出。经过搜索,我使用关闭 Hook 取得了部分成功,但它无法正常工作。

在注释行中,程序似乎在退出前循环了很多次(这是主线程自己循环吗?),在注释中,我在下一行尝试读取输入流时遇到异常。

实现此目标的最佳方法是什么?

最佳答案

您需要做某事 来停止循环。将 private static volatile boolean running = true; 添加到类中,将 while(true) 更改为 while(running) 然后获取关闭 Hook 设置 running=false; 并检查结果。Volatile 将确保您的应用程序在多个处理器和/或内核下运行时仍能迅速关闭。

[编辑]

问题是 Scanner 正在阻塞(抱歉我第一次错过了它),这需要您中断主线程;

private static Thread mainThread;
public static void main(String[] args)
{
mainThread = Thread.currentThread();

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

关于Java 控制台程序和 CTRL-C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5124439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com