重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章将为大家详细讲解有关Java中怎么实现守护线程与用户线程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
创新互联公司服务项目包括阜阳网站建设、阜阳网站制作、阜阳网页制作以及阜阳网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,阜阳网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到阜阳省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
1. Java 线程
1.1 守护线程与用户线程
Java 线程分为守护线程(DaemonThread) 和 用户线程(UserThread)两类.
通常情况下,我们使用Thread 创建的线程在默认情况下都属于用户线程, 当在启动线程之前, 执行thread.setDaemon(true)时, 线程会变成守护线程。
其实在本质上,用户线程和守护线程并没有太大区别,唯一的区别就是会影响虚拟机的退出(程序的终止)。当jvm中只剩下守护线程时,虚拟机会退出,及程序终止;而当jvm中至少拥有一个用户线程时,jvm都不会退出。
1.2 守护线程特点
Java 中的守护线程和linux 中的守护进程还是有些区别的, linux 守护进程时系统级别的, 当系统退出时, 才会终止. 而java 中的守护线程时jvm 级别的, 当jvm中无任何用户进程时, 守护进程销毁, jvm 退出, 程序终止. 笔者认为java 守护进程的最主要的特点有:
守护进程是运行在程序后台的线程
守护进程创建的进程,依然时守护进程
守护进程不会影响jvm的退出,当jvm只剩余守护进程时,jvm 进行退出
守护进行在jvm退出时,自动销毁
在开发java 守护线程时, 需要注意:
在线程启动之前, 及执行thread.start() 方法前, 设置thread.setDemon(true);
在守护线程中启动的子线程也是守护线程
守护线程不建议进行写操作, 因为守护进程随时可能结束。
1.3 守护线程适用场景
针对于守护线程的特点,笔者认为,java 守护线程通常可用于开发一些为其它用户线程服务的功能。比如说心跳检测,事件监听等。Java 中最有名的守护进程当属GC(垃圾回收)
2. java 守护线程开发
开发守护进程时需要注意两点:
必须在线程启动之前,即执行thread.start()方法前, 执行thread.setDaemon(true) 方法,否则会抛出异常IllegalThreadStateException
守护线程中创建的线程也是守护线程
2.1 测试程序退出
注释thread.setDaemon(true)时, 线程为用户线程, 程序进行无线循环, 程序不终止。
设置thread.setDaemon(true)后, 线程变成守护线程, 程序直接终止, 仅输出一行信息"main thread done"。 因为程序执行完system 语句之后, main 程序作为唯一的一个用户线程执行结束了, jvm 中只剩下一个守护进程,所以jvm 便退出了。
public class TestThread { public static void main(String[] args) { AnsyTask ansyTask = new AnsyTask(); Thread thread = new Thread(ansyTask); // 设置线程为异步线程 // thread.setDaemon(true); // 启动线程 thread.start(); System.out.println("main thread done"); } } class AnsyTask implements Runnable{ @Override public void run() { while (true){ System.out.println(LocalDateTime.now() + "-hello,thread"); } } }
2.2 测试守护线程中创建新的线程
测试会发现, 默认情况下, 守护线程创建的子线程依然是守护线程,用户创建的守护线程依然时用户线程。也可以在创建子线程时通过setDaemon()方法修改.
public class TestThread { public static void main(String[] args) throws InterruptedException { AnsyTask ansyTask = new AnsyTask(); Thread thread = new Thread(ansyTask); // 设置线程为异步线程 thread.setDaemon(true); // 启动线程 thread.start(); // 给守护线程点儿执行时间 Thread.sleep(1000l); } } class AnsyTask implements Runnable{ @Override public void run() { Thread thread = new Thread("subThread"); System.out.println(thread.getName() + " is daemon:" + thread.isDaemon()); } }
关于Java中怎么实现守护线程与用户线程就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。