`
ivan19861025
  • 浏览: 41029 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

    博客分类:
  • Java
 
阅读更多

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

先看如下代码:

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

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics