守护线程

守护线程是一种比较特殊的线程,通常用于处理后台的工做,它会随着调用线程的结束而技术:java

看下面一段代码服务器

package com.example.demo.threads;


import java.util.concurrent.TimeUnit;

/**
 * 守护线程
 */
public class MainTest2 {

    public static void main(String[] args) {

        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    TimeUnit.SECONDS.sleep(10);
                    System.out.println(">>>>>执行了10秒的方法,线程name:" + Thread.currentThread().getName());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();
        //thread.setDaemon(true);

        try {
            TimeUnit.SECONDS.sleep(5);
            System.out.println(">>>>>执行了5秒的方法,线程name:" + Thread.currentThread().getName());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

 

执行这段程序以后就会发现,程序先打印主现成的的main方法,在打印thread-0的方法,在此期间jvm没有关闭,一直等到执行完了Thread-0打印的方法时才退出。jvm

 

 

 接下来在看下咱们代码,设置一下thread为守护线程ide

package com.example.demo.threads;


import java.util.concurrent.TimeUnit;

/**
 * 守护线程
 */
public class MainTest2 {

    public static void main(String[] args) {

        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    TimeUnit.SECONDS.sleep(10);
                    System.out.println(">>>>>执行了10秒的方法,线程name:" + Thread.currentThread().getName());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        thread.setDaemon(true);

        thread.start();

        try {
            TimeUnit.SECONDS.sleep(5);
            System.out.println(">>>>>执行了5秒的方法,线程name:" + Thread.currentThread().getName());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

 

执行的结果以下:它并无等到Thread线程执行完毕在结束,而是直接随着main线程的结束而结束。spa

 

 

 注意点:线程

1.设置线程为守护线程很简单,调用线程的setDaemon()方法设置成true便可,false为正常线程code

2.线程是否为守护线程和他的父线程有很大的关系,若是父线程为正常线程,则子线程也是守护线程。反之,若是想要修改就能够借助 setDaemon()方法blog

3.线程的isDaemon方法能够判断线程是否为守护线程。游戏

4.setDaemon()的方法只有在线程启动以前才能生效,若是一个线程已经死忙,那么在设置setDaemon就会抛出 IllegalThreadStateException的异常。get

 

守护线程的做用:

1.守护线程的特色,当主线程结束的时候,其(主线程开启的子线程)也跟着结束。

2.使用场景,jvm虚拟机中的垃圾回收线程。

3.好比有一个游戏程序,其中有一个线程正在与服务器不断的进行交互获取玩家最新的金币,武器等这些信息,若但愿在退出游戏客户端的时候,这些数据同步的工做也能当即结束。

4.好比注册中心(eruka)中与服务的心跳传输机制。

相关文章
相关标签/搜索