java daemon

<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>

java daemon是什么,让我们一起了解一下。

daemon线程是为我们创建的用户线程提供服务的线程,比如说jvm的GC等等。这样的线程有一个非常明显的特征,当用户线程运行结束的时候,daemon线程将会自动退出。

daemon线程的特点是什么?

1、daemon线程创建的过程中需要先调用setDaemon方法进行设置,然后再启动线程,否则会报出IllegalThreadStateException异常。

2、由于daemon线程的终止条件是当前是否存在用户线程,所以我们不能指派daemon线程来进行一些业务操作,而只能服务用户线程。

3、daemon线程创建的子线程任然是daemon线程。

java daemon

那么Daemon线程与非Daemon线程有什么区别?

基本上没有什么区别,不同之处就是当 java虚拟机中所有的非Daemon线程都停止运行之后,即使还存在有Daemon线程,java虚拟机也会退出。这是因为Daemon线程没有了被守护者,所以其也就没有继续运行的必要了。

Daemon线程可以通过调用Thread.setDaemon(true)设置,但是该方法的调用必须是在线程启动之前设置,否则将会抛出一个IllegalThreadStateException异常,这是因为一个正在运行中的线程是不能被设置成守护线程的。

Daemon线程被用作完成支持性的工作,但是在java虚拟机退出的时候Daemon线程中的finally代码块并不一定执行。

代码示例:

public class TestDaemonThread {    public static void main(String[] args) {        Thread thread = new Thread(new Runnable() {            @Override            public void run() {                try {                    SleepUtils.second(1);                }finally {                    System.out.println("DaemonThread finally run.");                }                System.out.println();            }        }, "DaemonThread");        //在线程执行前设置为daemon线程        thread.setDaemon(true);        thread.start();    }}