JAVA并发编程-多线程(2) 优雅退出JVM

这里我不知道如何解释优雅一词

先看如下代码:

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执行完.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值