赶紧收藏!2024 年最常见 100道 Java 基础面试题(十九)

上一篇地址:赶紧收藏!2024 年最常见 100道 Java 基础面试题(十八)-CSDN博客

三十七、守护线程是什么?

守护线程(Daemon Thread)是Java中的一种特殊类型的线程,它的目的是为其他线程的执行提供支持,比如垃圾回收线程就是一个典型的守护线程。守护线程与用户线程(User Thread,也就是非守护线程)的主要区别在于,当用户线程全部结束时,虚拟机(JVM)会退出,而守护线程的结束不会导致JVM的退出。

以下是守护线程的一些关键特点:

  1. 后台支持: 守护线程通常用于执行后台任务,如监控、内存管理、信号处理等。

  2. 生命周期: 守护线程的生命周期不会阻止JVM的退出。当所有用户线程都结束时,JVM会结束运行,即使守护线程还在运行。

  3. 创建方式: 创建守护线程与创建普通线程类似,但必须在调用Thread.start()之前,通过调用Thread.setDaemon(true)方法来设置线程为守护线程。

  4. 垃圾回收线程: Java虚拟机的垃圾回收线程是守护线程的一个例子。它们负责回收不再使用的对象,释放内存资源。

  5. JVM启动: JVM启动时会创建一些守护线程来处理如类加载、信号处理等后台任务。

  6. 结束守护线程: 守护线程与普通线程一样,可以通过Thread.interrupt()方法来中断,或者自然终止。

  7. 使用场景: 如果一个线程的任务是为其他线程提供服务,且这个服务不是必需的,那么这个线程可以被设置为守护线程。

  8. 示例代码

  9. public class DaemonThreadExample {public static void main(String[] args) {Thread daemonThread = new Thread(() -> {while (true) {// 执行一些后台任务System.out.println("Daemon thread is running");try {Thread.sleep(1000); // 暂停1秒} catch (InterruptedException e) {e.printStackTrace();break; // 如果线程被中断,则退出循环}}});// 设置为守护线程daemonThread.setDaemon(true);daemonThread.start();// 主线程睡眠5秒后结束try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}}
    }

在这个例子中,主线程在睡眠5秒后结束,守护线程继续运行直到主线程结束。如果将线程设置为守护线程,JVM将在主线程结束后退出,即使守护线程还在运行。

总结

  • 守护线程是为其他线程提供支持的后台线程,它们不会阻止JVM的退出。
  • 守护线程通常用于执行非关键的后台任务,如垃圾回收、日志记录等。
  • 通过Thread.setDaemon(true)方法可以在启动线程之前将其设置为守护线程。

三十八、创建线程有哪几种方式?

在Java中,创建线程主要有以下几种方式:

  1. 继承Thread: 通过让类继承java.lang.Thread类并重写其run()方法来创建线程。这种方式是Java最初提供的线程创建方法。

  2. public class MyThread extends Thread {public void run() {// 线程执行的代码}
    }
    MyThread t = new MyThread();
    t.start();
  3. 实现Runnable接口: 通过实现java.lang.Runnable接口并将其实例作为参数传递给Thread类的构造方法来创建线程。这是推荐的方式,因为它更易于扩展和实现回调。

  4. public class MyRunnable implements Runnable {public void run() {// 线程执行的代码}
    }
    Thread t = new Thread(new MyRunnable());
    t.start();
  5. 使用Callable接口和FutureCallable接口类似于Runnable,但它可以返回值和抛出异常。通过Callable任务可以获取线程执行的结果,通常与FutureFutureTask结合使用。

  6. public class MyCallable implements Callable<String> {public String call() {// 执行线程任务并返回结果return "Callable result";}
    }
    FutureTask<String> task = new FutureTask<>(new MyCallable());
    Thread t = new Thread(task);
    t.start();
    // 稍后获取任务结果
    String result = task.get(); // 这将阻塞直到任务完成
  7. 使用java.util.concurrentjava.util.concurrent包提供了更高级的线程和同步工具,如ExecutorServiceThreadPoolExecutorScheduledThreadPool等。这些工具可以帮助创建线程池,更高效地管理线程资源。

  8. ExecutorService executor = Executors.newFixedThreadPool(3);
    executor.submit(() -> {// 线程执行的代码
    });
    executor.shutdown(); // 关闭线程池
  9. 使用ThreadFactoryThreadFactory接口用于创建新线程,可以通过ExecutorService的实现类传递自己的ThreadFactory来创建具有特定属性的线程。

    ThreadFactory threadFactory = new ThreadFactory() {public Thread newThread(Runnable r) {Thread t = new Thread(r);t.setPriority(Thread.MIN_PRIORITY);return t;}
    };
    ExecutorService executor = Executors.newFixedThreadPool(3, threadFactory);
  10. 使用ThreadLocalThreadLocal并不是用来创建线程的,但它与线程紧密相关,用于提供线程内的局部变量。在某些情况下,可能会与线程创建和执行逻辑一起使用。

每种方式都有其适用场景,选择哪一种取决于具体的应用需求。例如,如果需要线程返回结果,可以使用Callable;如果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/5344.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓获取SHA

1&#xff1a;安卓通过签名key获取SHA 方式有两种&#xff0c; 1、电脑上来存在eclipse的用户或正在使用此开发工具的用户就简单了&#xff0c;直接利用eclipse 走打包流程&#xff0c;再打包的时候选择相应的签名&#xff0c;那么在当前面板的下面便会出现签名的相关信息。 2、…

springboot615基于springboot的旅游出行指南_655ms--论文

springboot615基于springboot的旅游出行指南_655ms--论文 springboot615基于springboot的旅游出行指南

23 重构:烟囱式、平台化、中台化的架构

上一讲里&#xff0c;我们介绍了两大类型的系统升级重构方案&#xff0c;还介绍了如何进行重构版本的上线&#xff0c;以及如何平滑地完成新老版本切换的方案。在本讲里&#xff0c;将会具体介绍如何判断系统发展到什么阶段需要重构&#xff0c;以及如何实施重构。 系统稳定性…

AutoBackgroundBackButton 在ScrollView上方自动根据返回键按钮下方内容动态改变颜色。自动变色返回键

在日常有时候有一些为了优化体验的需求。AutoBackgroundBackButton 一个可以根据按钮下方背景颜色动态的改版返回键自定义ImageView。这里只展示了黑白切换方式&#xff0c;你如果还有其他需求可以参考颜色校验来自己实现切换对应颜色按钮。【例如白色背景展示黑色样式&#xf…

【Git】修改提交记录的日期和提交信息

1. 查看日志 git log 2. 修改最近一次提交的时间 git commit --amend --date"2024-05-01T09:30:000800" -am ":memo: 更新 TODO.md" 3. 修改最近一次提交的时间并使用指定提交记录的信息 git commit --amend --date"2024-05-01T09:30:000800&quo…

深入了解Java中的Thread类

在Java编程中&#xff0c;Thread类是一个核心的类&#xff0c;用于创建和管理线程。线程是程序执行的最小单元&#xff0c;多线程编程可以提高程序的并发性和效率。 本文将深入介绍Java中的Thread类&#xff0c;包括其基本概念、创建线程的方法、线程状态的转换、线程同步与通…

Python urllib 爬虫入门(1)

本文主要为Python urllib类库函数和属性介绍及一些简单示例。 目录 urllib爬取网页 简单示例 写入文件 其他读取方法 readline函数 readlines函数 response属性 当前环境信息 返回状态码 返回url地址 对url进行编码与解码 写入文件 总结 urllib爬取网页 通过pyth…

保障互联网基础:深度解析DNS安全

目录 前言 一. DNS 概述 二. DNS 安全威胁 1..DNS欺骗 2.DNS缓存污染 3.DNS放大攻击 4.DNS隧道 5.危害 5.1数据盗窃和财务损失 5.2声誉损害和品牌蚀刻 5.3合规和监管问题 5.4系统停机和生产力损失 三. DNS 安全解决方案 1.DNSSEC&#xff08;域名系统安全扩展&…

PotatoPie 4.0 实验教程(35) —— FPGA实现摄像头图像二值化膨胀效果

手机扫码 链接直达 https://item.taobao.com/item.htm?ftt&id776516984361 什么是图像二值化膨胀&#xff0c;有什么作用&#xff1f; 图像二值化膨胀是图像处理中的一种基本操作&#xff0c;它用于扩展和增强二值图像中的白色区域。具体而言&#xff0c;二值化膨胀操作…

【论文笔记】Training language models to follow instructions with human feedback A部分

Training language models to follow instructions with human feedback A 部分 回顾一下第一代 GPT-1 &#xff1a; 设计思路是 “海量无标记文本进行无监督预训练少量有标签文本有监督微调” 范式&#xff1b;模型架构是基于 Transformer 的叠加解码器&#xff08;掩码自注意…

LeetCode55:跳跃游戏

题目描述 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 解题思想 每次…

update_min_vruntime()流程图

linux kernel scheduler cfs的update_min_vruntime() 看起来还挺绕的。含义其实也简单&#xff0c;总一句话&#xff0c;将 cfs_rq->min_vruntime 设置为&#xff1a; max( cfs_rq->vruntime, min(leftmost_se->vruntime, cfs_rq->curr->vruntime) )。 画个流…

解决chunk-vendors.js文件太大,首屏加载很慢

首先介绍一款插件script-ext-html-webpack-plugin 可以动态插入script标签到HTML模板文件中&#xff0c;帮助开发者更好地控制脚本的加载和执行顺序&#xff0c;从而提高页面性能和用户体验。此外&#xff0c;该插件还允许开发者将JavaScript文件分为不同的块(chunk)并在HTML文…

【QT】串口通信,usb通信QSerialPort::TimeoutErro超时问题

在处理 QSerialPort::TimeoutError 时&#xff0c;通常不需要重启整个软件。这种错误通常指出在进行串口操作&#xff08;如读取或写入&#xff09;时超时&#xff0c;但它不一定意味着串口设备出现了不可修复的错误。应该根据具体的错误情况采取合适的错误恢复策略。以下是一些…

大数据数据埋点技术面试题及参考答案(持续更新)

目录 数据埋点是什么? 数据埋点的主要目的有哪些?

滑动窗口详解

目录 一、滑动窗口的特定步骤&#xff1a; 二、题目解析 1、⻓度最⼩的⼦数组---点击跳转题目 3、最⼤连续 1 的个数 III----点击跳转题目 4、将 x 减到 0 的最⼩操作数----点击跳转题目 5、⽔果成篮----点击跳转题目 滑动窗口是双指针算法中细分的一种&#xff0c;它由暴…

SQL中为什么不要使用1=1?

为什么会使用 11&#xff1f; 在动态构建SQL查询时&#xff0c;开发者可能会不确定最终需要哪些条件。这时候&#xff0c;他们就会使用“11”作为一个始终为真的条件&#xff0c;让接下来的所有条件都可以方便地用“AND”连接起来&#xff0c;就像是搭积木的时候先放一个基座&…

安全运维 -- splunk 操作手册

0x00 背景 splunk 日常运维操作笔记。 0x01 场景 1.agent 安装 linux&#xff1a; tar -zxvf splunkforwarder-8.0.3-a6754d8441bf-Linux-x86_64.tgz -C /opt cp -r config /opt/splunkforwarder/etc/apps vi /opt/splunkforwarder/etc/apps/prefix_app_inputs/local/inputs…

PDF高效编辑器,支持修改PDF文档并转换格式从PDF文件转换成图片文件,轻松管理你的文档世界!

PDF文件已成为我们工作、学习和生活中不可或缺的一部分。然而&#xff0c;传统的PDF阅读器往往只能满足简单的查看需求&#xff0c;对于需要频繁编辑、修改或转换格式的用户来说&#xff0c;就显得力不从心。现在&#xff0c;我们为您带来一款全新的PDF高效编辑器&#xff0c;让…

挑战一周完成Vue3项目Day3: 品牌管理+平台属性管理+SPU管理+SKU管理

一、真实接口替换mock接口 &#xff08;1&#xff09;替换各个环境下的服务器地址&#xff08; .env.development、.env.production、.env.test &#xff09; VITE_SERVE"http://sph-api.atguigu.cn" &#xff08;2&#xff09; 配饰代理跨域&#xff1a;vite.con…