这里我不知道如何解释优雅一词
先看如下代码:
public class DaemonThread {
public static void main(String[] args) {
final Thread t = new Thread() {
@Override
public void run() {
System.out.println("线程working, 并休息20秒");
try {
Thread.sleep(1000 * 20);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程finish");
}
};
// t.setDaemon(true);//设置为守护线程, 不设置默认为用户线程
t.start();
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
while (t.isAlive()) {
try {
Thread.sleep(1000 * 1);
System.out.println("业务线程还没处理完, 请等待");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("业务线程执行完毕, JVM退出");
}
});
System.out.println("主线程执行完毕,等待其他用户线程执行完毕后退出");
}
}
正常运行结果如下:
$ java DaemonThread
线程working, 并休息20秒
主线程执行完毕,等待其他用户线程执行完毕后退出
线程finish
业务线程执行完毕, JVM退出
假如我在该进程运行结束前执行kill 进程号. 那么t线程的任务仍然会执行. 执行完后JVM正常退出.
运行结果如下:
$ java DaemonThread
线程working, 并休息20秒
主线程执行完毕,等待其他用户线程执行完毕后退出
业务线程还没处理完, 请等待
业务线程还没处理完, 请等待
业务线程还没处理完, 请等待
业务线程还没处理完, 请等待
业务线程还没处理完, 请等待
业务线程还没处理完, 请等待
业务线程还没处理完, 请等待
业务线程还没处理完, 请等待
业务线程还没处理完, 请等待
业务线程还没处理完, 请等待
业务线程还没处理完, 请等待
线程finish
业务线程还没处理完, 请等待
业务线程执行完毕, JVM退出
关键代码如下
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
while (t.isAlive()) {
try {
Thread.sleep(1000 * 1);
System.out.println("业务线程还没处理完, 请等待");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("业务线程执行完毕, JVM退出");
}
});
如果 没有这段代码, 在运行kill 进程时, JVM就会立即退出进程.不会等待线程t执行完.