Java线程和多线程——守护线程

Posted EthanPark

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java线程和多线程——守护线程相关的知识,希望对你有一定的参考价值。

当我们在Java中创建线程的时候,这个线程在默认的情况下是一个用户线程,并且,如果这个线程在运行,那么JVM就不会终结这个应用。和用户线程不同,当一个线程被标记为守护线程的时候,JVM在用户线程结束的时候,是不会持续等待守护线程结束的,而是直接结束程序,并且结束程序中相关的守护线程。

Thread.setDaemon(true)方法可以用来将线程置为守护线程,参考下面的例子:

package com.sapphire.threads;

public class JavaDaemonThread 

    public static void main(String[] args) throws InterruptedException 
        Thread dt = new Thread(new DaemonThread(), "dt");
        dt.setDaemon(true);
        dt.start();
        //continue program
        Thread.sleep(30000);
        System.out.println("Finishing program");
    



class DaemonThread implements Runnable

    @Override
    public void run() 
        while(true)
            processSomething();
        
    

    private void processSomething() 
        try 
            System.out.println("Processing daemon thread");
            Thread.sleep(5000);
         catch (InterruptedException e) 
            e.printStackTrace();
        
    

当执行上面的程序时,JVM会包含main方法这个线程,而后在main方法中创建一个用户线程,然后是变成了守护线程。当main函数结束的时候,程序就会结束,而且JVM也会同时关闭掉守护线程。

程序的输出如下:

Processing daemon thread
Processing daemon thread
Processing daemon thread
Processing daemon thread
Processing daemon thread
Processing daemon thread
Finishing program

但是,如果我们没有将线程置为守护线程的话,程序就永远都不会结束,就算main函数的线程执行完毕,程序仍然会继续下去。

通常来说,我们创建一个守护线程为了一些跟系统不那么相关的功能。举例来说,日志线程或者监控系统资源状态的线程等。

守护线程的配置必须在线程启动之前,参考Javadoc

    /**
     * Marks this thread as either a @linkplain #isDaemon daemon thread
     * or a user thread. The Java Virtual Machine exits when the only
     * threads running are all daemon threads.
     *
     * <p> This method must be invoked before the thread is started.
     *
     * @param  on
     *         if @code true, marks this thread as a daemon thread
     *
     * @throws  IllegalThreadStateException
     *          if this thread is @linkplain #isAlive alive
     *
     * @throws  SecurityException
     *          if @link #checkAccess determines that the current
     *          thread cannot modify this thread
     */
    public final void setDaemon(boolean on) 
        checkAccess();
        if (isAlive()) 
            throw new IllegalThreadStateException();
        
        daemon = on;
    

以上是关于Java线程和多线程——守护线程的主要内容,如果未能解决你的问题,请参考以下文章

如何设置java守护线程守护某一个线程

java守护线程

Java中的守护线程和非守护线程(转载)

Java 多线程之守护线程(Daemon)

并发编程8 线程的创建&验证线程之间数据共享&守护线程&线程进程效率对比&锁(死锁/递归锁)

Java的守护线程与非守护线程