用户线程&&守护线程
守护线程是为用户线程服务的,当一个程序中的所有用户线程都执行完成之后程序就会结束运行,程序结束运行时不会管守护线程是否正在运行,由此我们可以看出守护线程在 Java 体系中权重是比较低的。当一个程序中的所有用户线程都结束之后,无论守护线程是否在工作都会跟随用户线程一起结束。守护线程从业务逻辑层面来看权重比较低,但对于线程调度器来说无论是守护线程还是用户线程,在优先级相同的情况下被执行的概率都是相同的。守护线程的经典使用场景是垃圾回收线程,守护线程中创建的线程默认情况下也都是守护线程。
(一)想要查看线程是否为守护线程只需通过调用 isDaemon()
方法查询即可,如果查询的值为 false
则表示不为守护线程,自然也就属于用户线程了。
(二)果是线程,则可以通过设置 setDaemon(true)
方法将用户线程直接修改为守护线程,而如果是线程池则需要通过 ThreadFactory
将线程池中的每个线程都为守护线程才行。
//创建固定个数的线程池
ExecutorService threadPool = Executors.newFixedThreadPool(10, new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
// 设置线程为守护线程
t.setDaemon(true);
return t; }
});
- 守护线程的设置
setDaemon(true)
必须要放在线程的start()
之前,否则程序会报错。 - 在守护线程中创建的所有子线程都是守护线程。
- 使用
jojn()
方法会等待一个线程执行完,无论此线程是用户线程还是守护线程。 - 即使是守护线程,当程序中调用
join()
方法时,程序依然会等待守护线程执行完成之后再结束进程。
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
// 打印 i 信息
System.out.println("i:" + i);
try {
// 休眠 100 毫秒
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace(); } } } });
// 设置为守护线程
thread.setDaemon(true);
// 启动线程
thread.start();
// 等待线程执行完
thread.join();
System.out.println("子线程==守护线程:" + thread.isDaemon());
System.out.println("主线程==守护线程:" + Thread.currentThread().isDaemon()); }
最新文章
- IOS开发常用设计模式
- RabbitMQ/JAVA (发布/订阅模式)
- 【转】ASP.NET ViewState详解
- 遇到的 autoresizingMask 相关的问题
- 如何查看jar包的版本号?
- 动态规划——J 括号配对问题
- phpcms 内部检测用户名长度更改
- An Introduction to Interactive Programming in Python
- JS对文档进行操作
- LibVLC audio controls
- zepto学习之路--数组去重和原生reduce
- DedeCMS数据负载性能优化方案简单几招让你提速N倍
- Docker Hub工作流程-Docker for Web Developers(6)
- CSS基础知识(颜色、伪类、盒子模型)
- Python中eval函数的作用
- Virtual Machine
- 51nod--1265 四点共面 (计算几何基础, 点积, 叉积)
- Confluence 6 编辑站点欢迎消息
- Tips_方格拼图效果
- 伪异步IO
热门文章
- MySQL全面瓦解29:使用Partition功能实现水平分区
- accommodate ~ ache
- day07 Linux配置修改
- Java、Scala类型检查和类型转换
- [项目总结]论Android Adapter notifyDataSetChanged与notifyDataSetInvalidated无效原因
- redis入门到精通系列(七):redis高级数据类型详解(BitMaps,HyperLogLog,GEO)
- Oracle 表结构管理
- 解决PLSQL查不到带中文条件的记录
- 使用$.post方式来实现页面的局部刷新功能
- ActiveMQ(二)——ActiveMQ的安装和基本使用