Java并发编程之概念七:用户线程和守护线程

版权声明:本文为博主原创文章,大家可以随便转载,觉得好给个赞哦。 https://blog.csdn.net/baidu_25310663/article/details/88404172

在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)

用户线程(User )是可以理解为运行在前台的线程。

守护进程(Daemon)是运行在后台的一种特殊进程。Java平台把操作系统的底层进行了屏蔽,在JVM虚拟平台里面构造出对自己有利的机制,这就是守护线程的由来。它的作用是为其他线程的运行提供便利服务,它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。

例如:垃圾回收线程就是一个经典的守护线程,当我们的程序中不再有任何运行的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是JVM上仅剩的线程时,垃圾回收线程会自动离开。它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。

守护线程并非只有虚拟机内部提供,用户在编写程序时也可以自己设置守护线程,自行设定的方法:public final void setDaemon(boolean flag) 

注意点:

  1. thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。
  2. 在Daemon线程中产生的新线程也是Daemon的。
  3. 守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时候甚至在一个操作的中间发生中断。

 代码示例:

package com.hughjin.solr.thread;

public class DaemonTest {

    public static void main(String[] args) {
//        daemonThread();
        notDaemonThread();
        //证明main方法是用户线程(非守护线程)
        Thread t = Thread.currentThread();
        System.out.println("线程名:" + t.getName() + " Thread.isDaemon=" + t.isDaemon());
        System.out.println("main线程 结束....");
    }

    /**
     * 功能描述 : 守护线程
     * [相关类/方法]
     * [产品/模块版本]
     */
    public static void daemonThread() {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("子线程Thread.isDaemon:"+Thread.currentThread().isDaemon()+" 结束....");
            }
        });
        //设置为守护线程
        thread.setDaemon(true);
        thread.start();
    }

    /**
     * 功能描述 : 非守护线程
     * [相关类/方法]
     * [产品/模块版本]
     */
    public static void notDaemonThread() {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("子线程Thread.isDaemon:"+Thread.currentThread().isDaemon()+" 结束....");
            }
        });
        thread.start();
    }

}

--------------------- 
原文:https://blog.csdn.net/jichuang123/article/details/80330123  

猜你喜欢

转载自blog.csdn.net/baidu_25310663/article/details/88404172
今日推荐