• 从头认识java-18.2 主要的线程机制(5)-守护线程与非守护线程


    这一章节我们来讨论一下守护线程与非守护线程。

    1.什么是守护线程?什么是非守护线程?

    非守护线程:Java虚拟机在它全部非守护线程已经离开后自己主动离开。

    守护线程:守护线程则是用来服务用户线程的,假设没有其它用户线程在运行,那么就没有可服务对象,也就没有理由继续下去。


    2.同样点

    大家都是线程。事实上能够互相切换


    3.不同点:退出的时间点

    退出的先后顺序:

    非守护线程->守护线程->jvm

    4.注意点:

    (1)设置守护线程须要在start之前,否在抛异常

    package com.ray.ch17;
    
    public class Test {
    
    	public static void main(String[] args) {
    		WritePaper writePaper = new WritePaper();
    		Thread thread = new Thread(writePaper);
    		thread.start();
    		thread.setDaemon(true);
    	}
    }
    
    class WritePaper implements Runnable {
    	@Override
    	public void run() {
    		System.out.println("run");
    	}
    }

    输出:

    run
    Exception in thread "main" java.lang.IllegalThreadStateException
    at java.lang.Thread.setDaemon(Thread.java:1275)
    at com.ray.ch17.Test.main(Test.java:9)


    (2)由于上面第三点所说的退出时间节点问题。因此会出现以下的情况

    package com.ray.ch17;
    
    public class Test {
    
    	public static void main(String[] args) {
    		WritePaper writePaper = new WritePaper();
    		Thread thread = new Thread(writePaper);
    		thread.setDaemon(true);
    		thread.start();
    	}
    }
    
    class WritePaper implements Runnable {
    	@Override
    	public void run() {
    		System.out.println("run");
    	}
    }


    输出:

    (无)


    事实上这里根本就没有运行对应的语句。由于守护线程知道如今没有须要服务的非守护线程(用户自己定义线程),就直接退出了。


    假设想运行程序里面的输出。则不要设置守护:

    package com.ray.ch17;
    
    public class Test {
    
    	public static void main(String[] args) {
    		WritePaper writePaper = new WritePaper();
    		Thread thread = new Thread(writePaper);
    		thread.start();
    	}
    }
    
    class WritePaper implements Runnable {
    	@Override
    	public void run() {
    		System.out.println("run");
    	}
    }

    输出:

    run


    (3)守护线程与非守护线程事实上是没有本质差别,能够相互切换

    package com.ray.ch17;
    
    public class Test {
    
    	public static void main(String[] args) {
    		WritePaper writePaper = new WritePaper();
    		Thread thread = new Thread(writePaper);
    		thread.setDaemon(true);
    		thread.setDaemon(false);
    		thread.start();
    	}
    }
    
    class WritePaper implements Runnable {
    	@Override
    	public void run() {
    		System.out.println("run");
    	}
    }

    输出:

    run


    总结:这一章节主要介绍了守护线程与非守护线程的差别与联系。


    这一章节就到这里,谢谢。

    -----------------------------------

    文件夹




  • 相关阅读:
    【转】日本留学——修士申请注意事项
    【转】日本留学读研究生和修士有什么区别?申请误区有哪些
    【转】为什么说学一门小语种,就能打开新世界的大门?
    【转】TED:两年一门外语--她总结了学外语的秘诀
    【转】为什么一定要学一门外语?
    【转】学完标准日本语初级至高级,可以过日语n1吗?
    【转】去日本语言学校前,日语应该达到几级呢?
    Cordova学习
    敏捷开发实录(二)
    Mac端博客发布工具推荐
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7003062.html
Copyright © 2020-2023  润新知