线程分类
  在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)
  作用
  Daemon的作用是为其他线程的运行提供便利服务,守护线程典型的应用是 GC (垃圾回收器),它是一个很称职的守护者。
  区别
  User和Daemon两者几乎没有区别,的不同之处在于虚拟机的离开:如果 User Thread已经全部退出运行了,只剩下Daemon Thread存在了,虚拟机也退出了。 因为没有了被守护者,Daemon也没有工作可做了,也没有继续运行程序的必要了。
  不要用守护线程去做事情,因为主线程很快运行完了,虚拟机退出,Daemon停止服务,输出操作自然失败了。
  优先级:守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务。
  当JVM中所有的线程都是守护线程的时候,JVM可以退出了;如果还有一个或以上的非守护线程则JVM不会退出。
  应用
  在使用长连接的comet服务端推送技术中,消息推送线程设置为守护线程,服务于ChatServlet的servlet用户线程,在servlet的init启动消息线程,servlet一旦初始化后,一直存在服务器,servlet摧毁后,消息线程自动退出。Servlet容器默认采用单实例多线程的方式来处理请求,这样减少产生Servlet实例的开销。
  为什么要用守护线程?
  我们知道静态变量是ClassLoader级别的,如果Web应用程序停止,这些静态变量也会从JVM中清除。但是线程则是JVM级别的,如果你在Web 应用中启动一个线程,这个线程的生命周期并不会和Web应用程序保持同步。也是说,即使你停止了Web应用,这个线程依旧是活跃的。正是因为这个很隐晦 的问题,所以很多有经验的开发者不太赞成在Web应用中私自启动线程。
  如果我们手工使用JDK Timer(Quartz的Scheduler),在Web容器启动时启动Timer,当Web容器关闭时,除非你手工关闭这个Timer,否则Timer中的任务还会继续运行!
  Spring为 JDK Timer 和 Quartz Scheduler 所提供的TimerFactoryBean 和 SchedulerFactoryBean能够和Spring容器的生命周期关联,在 Spring容器启动时启动调度器,而在Spring容器关闭时,停止调度器。所以在Spring中通过这两个FactoryBean配置调度器,再从 Spring IoC 中获取调度器引用进行任务调度将不会出现这种Web容器关闭而任务依然运行的问题。而如果你在程序中直接使用Timer或Scheduler,如不进行额外的处理,将会出现这一问题。