在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)不需要。