侧边栏壁纸
博主头像
孔子说JAVA博主等级

成功只是一只沦落在鸡窝里的鹰,成功永远属于自信且有毅力的人!

  • 累计撰写 292 篇文章
  • 累计创建 132 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

java多线程之精灵线程/守护线程(Daemon)

孔子说JAVA
2021-08-06 / 0 评论 / 0 点赞 / 155 阅读 / 1,623 字 / 正在检测是否收录...

在java中,本身无法使虚拟主机保持活动的线程称为精灵线程Daemon,又称为守护线程,就是运行在程序后台的线程,一般被用于在后台为其它线程提供服务。既然它在后台运行,当前台线程(即主线程,又叫用户线程)运行完,主体程序就结束了,理所当然该后台线程也应该随之结束了。

  • 当一个应用程序的所有非精灵线程停止运行时,即使仍有精灵线程还在运行,该应用程序也将终止,反过来,只要还有非精灵线程在运行,应用程序就不会停止。我们可以通过setDaemon(boolean on)来设置某线程为精灵线程。用isDaemon()来判断某线程是否为精灵线程或守护线程。

注意:要想设置一个线程为精灵守护线程,setDaemon必须在start前调用。

1、精灵线程和非精灵线程的区别

/**
 * 子线程
 *
 * @Author kongzi
 */
public class ThreadMark_Child extends Thread {
    public void run(){
        for(int i = 1; i <= 20;i++){
            try{
                Thread.sleep(100);
            } catch (InterruptedException ex){
                ex.printStackTrace();
            }
            System.out.println("子线程 "+i);
        }
    }
}

2、子线程设置为精灵线程时

/**
 * 主线程/用户线程
 *
 * @Author kongzi
 */
public class MainThread extends Thread{
    public static void main(String [] args){
        ThreadMark_Child tm = new ThreadMark_Child();
        tm.setDaemon(true);// 设置为精灵线程
        tm.start();
        System.out.println("子线程是精灵线程吗?" +tm.isDaemon());
        try{
            Thread.sleep(1000);
        } catch (InterruptedException ex){
            ex.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"已经结束");
    }
}

// 以下是运行结果
子线程是精灵线程吗?true
子线程 1
子线程 2
子线程 3
子线程 4
子线程 5
子线程 6
子线程 7
子线程 8
子线程 9
main已经结束

3、子线程设置为非精灵线程时

/**
 * 主线程/用户线程
 *
 * @Author kongzi
 */
public class MainThread extends Thread{
    public static void main(String [] args){
        ThreadMark_Child tm = new ThreadMark_Child();
        tm.setDaemon(false);// 设置为非精灵线程
        tm.start();
        System.out.println("子线程是精灵线程吗?" +tm.isDaemon());
        try{
            Thread.sleep(1000);
        } catch (InterruptedException ex){
            ex.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"已经结束");
    }
}

// 以下是运行结果
子线程是精灵线程吗?false
子线程 1
子线程 2
子线程 3
子线程 4
子线程 5
子线程 6
子线程 7
子线程 8
子线程 9
main已经结束
子线程 10
子线程 11
子线程 12
子线程 13
子线程 14
子线程 15
子线程 16
子线程 17
子线程 18
子线程 19
子线程 20

4、结论

从代码运行结果可以看出来,当子线程设置为精灵线程时,若主线程结束,该精灵线程即使未运行完成也会结束。当子线程设置为非精灵线程时,主线程是否结束不影响非精灵线程的执行。

0

评论区