网站首页 > 精选教程 正文
Java 17 多线程中的守护线程
在 Java 的线程中,线程可以分为两类,一是用户线程,也被称为非守护线程。另外一种是守护线程。
那什么是守护线程呢?
守护线程是一种特殊的线程。当进程中不存在非守护线程时,则守护线程自动销毁。典型的守护线程的用法就是垃圾回收线程,当进程中没有了非守护的线程,则垃圾回收线程也就没有存在的必要了,自动销毁了。
首先创建一个线程类。代码如下:
class DaemonThread extends Thread {
@Override
public void run() {
int index = 0;
System.out.println("是否是守护线程: " + this.isDaemon());
try {
while (true) {
TimeUnit.MILLISECONDS.sleep(300);
System.out.println(++index);
}
} catch (InterruptedException e) {
}
}
}
测试代码如下:
import java.util.concurrent.TimeUnit;
public class Thread12 {
public static void main(String[] args) throws InterruptedException {
System.out.println(Thread.currentThread().getName() + " : " + Thread.currentThread().isDaemon());
DaemonThread daemonThread = new DaemonThread();
daemonThread.setDaemon(true);
daemonThread.start();
// 这里等待 1 秒钟,是为了更好的查看守护线程的生命周期。
// 要不然太快的结束主线程,新启动的线程就还没有启动起来也就看不到效果了
TimeUnit.SECONDS.sleep(1);
System.out.println(Thread.currentThread().getName() + "线程结束, 守护线程也会结束。");
}
}
完整代码
运行效果如下:
程序在 1 秒钟结束,DaemonThread 线程设置了为守护线程,所以在程序结束以后, while(true) 也被关闭。为了演示效果,线程中睡眠了 300 毫秒。1 秒钟 只有 3 个完整的毫秒,所以只会显示 1,2,3 的值。
需要注意 setDaemon 方法。设置守护线程的方法。
方法的定义如下:
public final void setDaemon(boolean on)
如果线程处于激活状态就会出现 IllegalThreadStateException 的异常。
演示效果如下:
需要注意的是,虽然会出现异常,但是并不会终止子线程的运行。
守护线程的知识点就先写到这,下面因为篇幅不够, 说说与多线程有关的两个名词。
思考: 并发和并行。
让我这个吃货给你说下用吃饭来说并发的概念。
中午要吃午饭了,饭桌上有媳妇和孩子。我吃了馒头,炒牛肉,炖鸡蛋。我只能一口馒头,一口菜,然后再来一点炖鸡蛋。这个就叫做并发。
这个时候, 同样是 2 个菜,一个主食,媳妇吃了炒牛肉, 我吃了馒头,孩子吃了炖鸡蛋。这个事情是同时发生的,这就叫做并行。
一个人(CPU)”同时”做多件事就是并发。同时:同一时间段内。
多个人(多核 CPU)”同时”做多件事就是并行。同时:同一时间点上。
所以只有在多 CPU 上才会出现并行。一个 CPU 的时候, 只能抢占资源, 谁抢占了谁执行。这样造成了看似在同时做多件事的感觉。可以把并发看成是逻辑上的同时发生。而并行是物理上的同时发生。
并行,相同的资源分配上,速度更快。
并发,相同的资源上,需要更多的时间处理多个事情。
这里不要纠结二义性。说我技术好, 比并行的干的还快。你们一周完成一个项目, 我两天就可以完成。不要这么卷。也不是这样对比的。你奔腾 2 代的 CPU 能干过 i7 嘛, 对不。要在同一资源上来比较,才有对比的意义。否则,别人的起点是一生都赶超不了的!咳咳。
具体的两个名词的使用方式。后续在进行举例子了。 这里只是先有个眼缘,让你下次再次遇到的时候不会略显陌生。毕竟很多知识点都是在潜移默化下觉得理所当然。
感谢您的阅读。关注,点赞,收藏。
猜你喜欢
- 2024-11-23 线程生命周期
- 2024-11-23 线程同步synchronized(不同步的问题、队列与锁),死锁产生和解决
- 2024-11-23 面试突击31:什么是守护线程?它和用户线程有什么区别?
- 2024-11-23 Java之TimeUnit的使用
- 2024-11-23 每日分享- NodeJS 程序中实现线程睡眠
- 2024-11-23 美团面试真题之一个线程OOM,进程里的其他线程还能运行吗?
- 2024-11-23 Java多线程-线程中断interrupt
- 2024-11-23 C++ 让线程休眠特定时间
- 2024-11-23 什么是线程死锁?形成条件是什么?如何避免?
- 2024-11-23 你能说出多线程中sleep、yield、join的用法及sleep与wait区别吗
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)