囚牢中的MQ的博客

码云的愿心:希望广大程序猿朋友摘掉苦逼的昵称

java

java守护线程的理解

coding云最近在公司项目中发现了一个问题,当时百思不得解,后来百度了很多后才找到了原因所在。现在总结一下问题所在,终归还是基础知识不扎实所致。

问题现象:

      我们的项目每日凌晨4点会执行一个跑批任务,这个任务需要计算合格用户。项目实现方式是在项目启动时,启动一个定时任务,每天4点就会执行这个任务,其实就是启动一个线程执行该任务。

      正式上线后,某天我需要重新部署线上tomcat,用service tomcat stop命令关闭tomcat进程,但是ps命令后,发现tomcat一直未能关闭,必须得 kill 掉才可以。

问题解决:

      后来百度了很多,开始时以为是tomcat配置有问题,但是以前service tomcat stop命令是完全没问题的,因此tomcat的问题pass掉了;最终找到了问题所在,原来是项目启动后,启动了一个定时执行的普通线程,执行tomcat 的stop命令后,由于该线程还未执行完毕,所以不能退出jvm,因此导致tomcat不能关闭。

      解决问题在于将这个定时执行的普通线程改为守护线程即可,当执行tomcat的stop命令后,守护线程会立即退出,所以tomcat就能即刻关闭了。

/**
 * 守护线程的工厂
 * 返回守护线程
 * @author coding云
 * 2015年5月18日
 */
public class DaemonThreadFactory implements ThreadFactory {

	//创建一个守护线程  
	public Thread newThread(Runnable r) {  
		Thread t = new Thread(r);  
		t.setDaemon(true);    //设置为守护线程
		System.out.println("t.isDaemon():" + t.isDaemon());
		return t;  
	}  
}



(转载本站原创文章请注明作者与出处Coding云--codingyun.com)

囚牢中的MQ的博客:

功能开发中...。