某些应用场景下,我们设计服务的时候要考虑到应用停止/被停止 时做一些善后操作,比如:关闭线程、释放连接资源等。
Java语言中,我们可以通过Runtime.getRuntime().addShutdownHook()方法来注册钩子,以保证程序平滑退出,如下:
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
System.out.println("hook running...");
}
}));
注册了钩子线程后,程序收到退出信号后,会保持程序运行,直到钩子线程执行完毕,才把程序的所有线程停止并退出。
import java.util.concurrent.TimeUnit;
/**
* ${DESCRIPTION}
*
* @author Ricky Fung
* @create 2016-11-22 13:33
*/
public class ShutdownHookTest {
public static void main(String[] args){
//启动5个线程执行任务
for(int i=0;i<5;i++){
final int id = i;
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread_"+id+" start...");
try {
TimeUnit.SECONDS.sleep(id);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread_"+id+" finish!");
}
}).start();
}
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
System.out.println("hook running...");
}
}));
}
}