如何在Java程序中处理Ctrl+C

在Java控制台程序中,特别是多线程的Java控制台程序中,中途中断程序可能产生不可预料的结果,比如文件描述符没有关闭,造成文件格式的破坏,或者 远程连接没有关闭,造成远程服务器资源的浪费,等等。所以在程序中添加Ctrl+C处理机制很有必要,下面根据一个例子作一下介绍如何处理:

在 程序中调用RunRuntime.getRuntime().addShutdownHook(Thread handler)就可以添加一个程序退出处理线程handler,一旦发生程序退出,线程handler开始运行。这样就可以在handler的run函 数中进行资源的释放,文件描述符的关闭等操作。下面是一个简单的例子:

/**
 * This Class introduced how to handle Ctrl+C in your program <BR>
 * You can close file descriptor, close remote connection , release memory and
 * so on when Ctrl C happens.
 *
 * @author Ahui Wang
 *
 */
public class CtrlC implements Runnable {
    private boolean bExit = false;
    private class ExitHandler extends Thread {
        public ExitHandler() {
            super("Exit Handler");
        }
        public void run() {
            System.out.println("Set exit");
            bExit = true;
        }
    }
    public CtrlC() {
        Runtime.getRuntime().addShutdownHook(new ExitHandler());
    }
    public void run() {
        while (!bExit) {
            // Do some thing
        }
        System.out.println("Exit OK");
    }
    public static void main(String[] args) throws InterruptedException {
        CtrlC ctrlc = new CtrlC();
        Thread t = new Thread(ctrlc);
        t.setName("Ctrl C Thread");
        t.run();
        t.join();
    }
}

上面程序中有一个main线程,一个主线程,一个Ctrl+C处理线程,当发生Ctrl+C时,处理线程设置退出标志,主线程判断到退出标志后自动退出。

每个java应用程序都有一个Runtime类的实例。程序可以同过这个实例与运行环境交互。应用程序只能通过Runtime.getRuntime()来获得Runtime实例,不能自己创建。


################

异常处理类需要继承Thread,但是外面的类(CtrlC)不需要。

在 C# ,如果你通过 `Process` 类打开了 WildFly 的 standalone.bat 启动脚本,想要模拟发送 `Ctrl+C` 关闭 Java 服务,你可以使用 `StreamWriter` 和 `Powershell` 来实现。这是因为直接对启动进程发送 Ctrl+C 可能不会像预期那样工作,因为有些程序可能会捕获并忽略这个信号。以下是步骤: 1. 首先,创建一个新的 `ProcessStartInfo` 对象,并指定要运行的 `standalone.bat` 脚本的路径。 ```csharp using System.Diagnostics; string batFilePath = "path_to_your_standalone.bat"; ProcessStartInfo psi = new ProcessStartInfo(batFilePath); psi.UseShellExecute = false; // 确保以非交互模式运行 psi.RedirectStandardInput = true; psi.RedirectStandardOutput = true; psi.RedirectStandardError = true; ``` 2. 创建一个 `Process` 实例并开始执行命令。 ```csharp Process process = new Process(); process.StartInfo = psi; process.Start(); ``` 3. 使用 `StreamWriter` 发送 `Ctrl+C` 到 `stdin` (标准输入)。这通常表示键盘输入。 ```csharp byte[] inputBuffer = Encoding.ASCII.GetBytes("\03"); // Ctrl+C 的 ASCII 编码 process.StandardInput.Write(inputBuffer); ``` 4. 等待一段短时间,让系统处理这个信号(例如 500 毫秒),然后关闭 `StandardInput`。 ```csharp System.Threading.Thread.Sleep(500); // 500毫秒的等待 process.StandardInput.Close(); ``` 5. 最后,可以检查 `StandardOutput` 或 `StandardError` 获取任何可能的响应信息。 注意:这种方法可能因 WildFly 的设置而异,如果它有特殊的处理机制来忽略 `Ctrl+C` 或者需要更复杂的交互才能终止,可能需要进一步的研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值