今天遇到了Thread的相关知识, 于是搜索并整理了一下。在这里写一篇博客,简单记录吧。参考博客

在Java中,或者说具体点,在JVM中有两种线程:用户线程(User Thread)守护线程(Daemon Thread)

  1. 所谓守护线程,是指在程序运行的时候在后台提供一种通用服务的线程,这类线程并不是用户线程不可或缺的部分,只是用于提供服务的“服务线程”。总的来说,守护线程使用的情况比较少,但并非无用。比如说,JVM的垃圾回收、内存管理等线程都是守护线程。还有就是在做数据库应用的时候,使用的数据库连接池,连接池本身也包含着很多后台线程,监控连接个数、超时时间、状态等等。

  2. 用户线程和守护线程两者几乎没有区别,调用线程对象的方法setDaemon(true),则可以将普通线程设置为守护线程。在阿里的笔试题中有这么一条“将一个线程标记成daemon线程,意味着当主线程结束,并且没有其它正在运行的非daemon线程时,该daemon线程也会自动结束”。这里说的就是设置为守护线程。

  3. 基于这个特点,当虚拟机中的用户线程全部退出运行时,守护线程没有服务的对象后,JVM也就退出了。(守护线程的优先级非常低,通常在程序里没有其他线程运行时才会执行它。)即:当线程中只剩下守护线程时JVM就会退出,反之还有任意一个用户线程在,JVM都不会退出。

  4. 在第二点说到过,将线程转换为守护线程可以通过调用Thread对象的setDaemon(true)方法来实现。在使用守护线程时需要注意以下几点:
    • thread.setDaemon(true)必须在thread.start()之前设置,否则会抛出IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。
    • 在Daemon线程中产生的新线程也是Daemon的。
    • 守护线程应该永远不去访问固有资源,如文件、数据库,因为它在任何时候甚至在一个操作的中间发生中断。

附加: 启动线程的方法是thread.start();线程stop()方法已经被弃用;等待其他线程的通知的方法是thread.wait()

无觅关联推荐,快速提升流量