并發基礎7(守護線程)

目錄

1:什么守護線程

2:守護線程使用

3:守護線程案例


1:什么守護線程

守護線程是Java中的一種特殊的線程類型,它為其他線程(非守護線程)提供后臺支持服務

在Java多線程編程中,有兩種特殊類型的線程:后臺線程和守護線程。這兩種線程在一些特定的場景下非常有用,但也需要謹慎使用。本文將詳細介紹后臺線程和守護線程的概念、特性、用法,以及注意事項。

守護線程的特點

服務性質:守護線程通常用于執行后臺任務,如JVM的垃圾回收、內存管理等

生命周期依賴:當所有非守護線程結束時,JVM會自動退出,不管是否還有守護線程在運行

優先級低:守護線程的優先級比較低

后臺線程和守護線程的生命周期都取決于是否還有前臺線程在運行。如果所有前臺線程都結束了,那么后臺線程和守護線程會自動退出。

守護線程 vs 非守護線程

特性守護線程非守護線程(用戶線程)
JVM退出影響不阻止JVM退出會阻止JVM退出
默認類型是(默認)
典型用途后臺服務程序主邏輯
子線程繼承繼承父線程的守護狀態繼承父線程的守護狀態

2:守護線程使用

Thread backgroundThread = new Thread(() -> {// 后臺線程的工作
});
//在啟動前設置setDaemon是true
backgroundThread.setDaemon(true);
backgroundThread.start();

3:守護線程案例

場景一:定時任務

后臺線程和守護線程非常適合執行定時任務。你可以創建一個后臺線程或守護線程來執行周期性的任務,例如定時清理臨時文件、定時發送心跳包等。

Thread timerThread = new Thread(() -> {while (true) {// 執行定時任務try {Thread.sleep(1000); // 暫停1秒鐘} catch (InterruptedException e) {e.printStackTrace();}}
});
timerThread.setDaemon(true); // 設置為守護線程
timerThread.start();

場景二:垃圾回收

垃圾回收器是Java中的經典守護線程的例子。垃圾回收線程會自動回收不再使用的內存,無需程序員的干預。這是Java內存管理的重要組成部分。

public class GarbageCollectorExample {public static void main(String[] args) {// 創建一個后臺線程來執行垃圾回收Thread garbageCollectorThread = new Thread(() -> {while (true) {System.gc(); // 手動觸發垃圾回收try {Thread.sleep(60000); // 每分鐘執行一次垃圾回收} catch (InterruptedException e) {e.printStackTrace();}}});garbageCollectorThread.setDaemon(true); // 設置為守護線程garbageCollectorThread.start();// 模擬應用程序的主要工作for (int i = 0; i < 10; i++) {System.out.println("Main Thread is running...");try {Thread.sleep(2000); // 主線程每2秒輸出一次} catch (InterruptedException e) {e.printStackTrace();}}}
}

在上面的示例中,我們創建了一個后臺線程 garbageCollectorThread,它會每分鐘執行一次垃圾回收。主線程會模擬應用程序的主要工作。由于 garbageCollectorThread 是后臺線程,當主線程結束時,它會自動退出。

場景三:日志記錄

在某些情況下,你可能希望在后臺記錄日志,而不干擾主要的應用程序流程。后臺線程可以用于將日志信息寫入文件或發送到遠程日志服務器。

public class LoggingExample {public static void main(String[] args) {// 創建一個后臺線程來執行日志記錄Thread loggingThread = new Thread(() -> {while (true) {logMessage("This is a log message.");try {Thread.sleep(5000); // 每5秒記錄一條日志} catch (InterruptedException e) {e.printStackTrace();}}});loggingThread.setDaemon(true); // 設置為守護線程loggingThread.start();// 模擬應用程序的主要工作for (int i = 0; i < 10; i++) {System.out.println("Main Thread is running...");try {Thread.sleep(2000); // 主線程每2秒輸出一次} catch (InterruptedException e) {e.printStackTrace();}}}private static void logMessage(String message) {// 此處可以將日志信息寫入文件或發送到遠程日志服務器System.out.println("Logging: " + message);}
}

在上面的示例中,我們創建了一個后臺線程 loggingThread,它會每5秒記錄一條日志。主線程模擬應用程序的主要工作。 logMessage 方法用于記錄日志信息,你可以根據實際需求將日志信息寫入文件或發送到遠程日志服務器。由于 loggingThread 是后臺線程,當主線程結束時,它會自動退出。

這些示例演示了如何使用后臺線程執行垃圾回收和日志記錄任務,同時確保這些線程不會阻止應用程序的正常退出。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/86585.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/86585.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/86585.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

蜣螂算法+四模型對比!DBO-CNN-BiLSTM-Attention系列四模型多變量時序預測

蜣螂算法四模型對比&#xff01;DBO-CNN-BiLSTM-Attention系列四模型多變量時序預測&#xff08;Matlab完整源碼和數據&#xff09; 目錄 蜣螂算法四模型對比&#xff01;DBO-CNN-BiLSTM-Attention系列四模型多變量時序預測&#xff08;Matlab完整源碼和數據&#xff09;效果一…

服務器的維護技術都有哪些?

服務器的穩定性與可靠性是十分重要的&#xff0c;當服務器出現故障或損壞時&#xff0c;會影響業務的正常運行&#xff0c;還會導致數據丟失給企業帶來巨大的經濟損失&#xff0c;所以大多數的企業通常掌握著有效的服務器維護技術&#xff0c;不僅能夠提高服務器的穩定性&#…

Go 語言并發編程

Go 語言的并發模型是其區別于其他編程語言的重要特性之一&#xff0c;它以簡潔高效的方式解決了現代編程中多核處理器利用和高并發場景的需求。 一、并發與并行&#xff1a;概念與區別 在理解 Go 的并發模型之前&#xff0c;需要明確并發與并行的差異&#xff1a; 并發&…

基于Versoria函數優化協方差更新的改進擴展卡爾曼濾波(MVC-EKF)與經典EKF的對比,附matlab源代碼|訂閱專欄后可查看完整代碼

本代碼實現了基于Versoria函數優化協方差更新的改進擴展卡爾曼濾波(MVC-EKF),并與傳統擴展卡爾曼濾波(EKF)進行對比。代碼通過一維非線性運動模型仿真,展示了MVC-EKF在處理含異常值觀測數據時的魯棒性優勢,適用于目標跟蹤、導航定位等狀態估計場景。訂閱專欄后,可直接查…

使用Docker安裝MySQL和Nginx

在 Docker 中安裝 MySQL 和 Nginx 非常簡單&#xff0c;只需使用 docker run 命令即可快速部署。以下是詳細步驟&#xff1a; 1. 安裝 MySQL &#xff08;1&#xff09;拉取 MySQL 鏡像 docker pull mysql:8.0 # 推薦使用 8.0 或 5.7 版本&#xff08;2&#xff09;運行 MyS…

線上活動丨主動式語音 AI:全雙工、對話輪次管理、VAD 技術交流會丨RTE Meetup

一同探索語音驅動的下一代人機交互界面&#xff0c;voice agent builder 的小規模深度交流會。 當用戶走在街上時&#xff0c;AI 可以主動提醒他們注意未察覺的來車或騎行者&#xff0c;甚至推薦附近不為人知的特色咖啡館。 同樣&#xff0c;如果系統檢測到用戶持續表達消極情緒…

如何用內網穿透遠程訪問Everything?實現隨時隨地快速檢索文件

Everything 是一款高效的文件搜索工具&#xff0c;但默認僅支持局域網內使用。使用 花生殼&#xff08;內網穿透&#xff09;&#xff0c;我們可以實現遠程訪問Everything&#xff0c;在外網也能快速檢索和管理本地文件。 本教程將詳細介紹如何配置花生殼映射&#xff0c;并設…

Docker 入門教程(六):聯合文件系統(UnionFS)

文章目錄 &#x1f433; Docker 入門教程&#xff08;六&#xff09;&#xff1a;聯合文件系統&#xff08;UnionFS&#xff09;一、聯合文件系統&#xff08;UnionFS&#xff09;二、Docker 鏡像的層級結構三、寫層&#xff08;Copy-on-Write&#xff09;四、鏡像構建緩存機制…

SQL在一個表中所有列查詢某個值

使用場景&#xff1a;知道表名&#xff0c;同時知道這個表中含有某個字符串&#xff0c;但是不知道這個字符串是在表的哪些列&#xff0c;在列比較多的情況下&#xff0c;查詢很麻煩&#xff0c;通過以下語句或者封裝的存儲可以查出字符串在哪些列出現。結果集里 ContainsValue…

【Outline】純Docker部署指南

本文介紹了使用Docker部署Outline知識管理系統的完整流程。 主要內容包括&#xff1a; 部署PostgreSQL 12數據庫并創建用戶&#xff1b;安裝Redis 6緩存服務&#xff1b;配置Minio對象存儲服務替代AWS S3&#xff1b;搭建SSO單點登錄服務器&#xff1b;準備Outline容器鏡像和環…

終止分區表變更操作時誤刪數據字典緩存導致MySQL崩潰分析

終止分區表變更操作時誤刪數據字典緩存導致MySQL崩潰分析 1. 問題簡述 在 MySQL 中&#xff0c;當終止一個處于 committing alter table to storage engine 階段的分區表操作時&#xff0c;InnoDB 會嘗試進行回滾并清理數據字典緩存。不幸的是&#xff0c;過程中發生了誤刪表…

進程關系與守護進程全解析

進程關系和守護進程 進程組 每一個進程除了有一個進程ID(PID)之外還屬于一個進程組。進程組是一個或者多個進程的集合&#xff0c; 一個進程組可以包含多個進程&#xff0c;每一個進程組也有一個唯一的進程組ID(PGID)&#xff0c; 并且這個PGID 類似于進程ID&#xff0c; 同樣…

PyAutoGUI 測試框架

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】

Git安裝避坑指南

Git高速下載 程序員面試資料大全&#xff5c;各種技術書籍等資料-1000G 一、安裝前準備&#xff1a;避免環境沖突 1. 檢查系統殘留&#xff08;Windows&#xff09; # 檢查舊版Git殘留 where git where git.exe# 檢查環境變量 $env:PATH -split ; | Select-String git# 清理…

MATLAB中的并行加速技術與工具

文章目錄 MATLAB中的并行加速技術與工具1. 多線程計算&#xff08;隱式并行&#xff09;2. Parallel Computing Toolbox (并行計算工具箱)2.1 parfor (并行for循環)2.2 spmd (單程序多數據)2.3 parfeval (異步并行執行) 3. GPU計算4. 分布式計算 (MATLAB Parallel Server)5. 批…

GR00T N1.5 技術報告 -- Nvidia -- 2025.6.11 -- 開源

0. 前言 GR00T N1 的詳細介紹 Isaac-GR00T 在6.11 進行了全面升級&#xff0c;從 N1 進化為 N1.5&#xff0c;但基本還是基于之前的架構&#xff0c;官方發布了一個技術報告&#xff0c;并更新了github庫&#xff0c;之前的N1也做了獨立版本 N1 N 1.5 github 技術報告 model…

SRS WebRTC 入門

什么是 SRS WebRTC? SRS (Simple Realtime Server) 是一個支持 WebRTC 流媒體的開源媒體服務器。它允許你建立基于 WebRTC 的低延遲直播和實時通信應用。 快速開始 1. 安裝 SRS bash # 使用 Docker 快速安裝 docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080…

從手機隨拍到標準掃描件:AI如何智能校正證件照片(Python+OpenCV)

目錄 一、概述二、解決方案2.1 核心挑戰&#xff1a;AI眼中的“三座大山”2.2 設計思路&#xff1a;給AI一個“智能提示”2.3 實現流程&#xff1a;四步搞定 三、代碼實現3.1 依賴庫3.2 代碼 四、結語 一、概述 在當今的線上業務中&#xff0c;要求用戶上傳身份證、駕駛證等證…

基于OpenCV圖像分割與PyTorch的增強圖像分類方案

在圖像分類任務中&#xff0c;背景噪聲和復雜場景常常會對分類準確率產生負面影響。為了應對這一挑戰&#xff0c;本文介紹了一種結合OpenCV圖像分割與PyTorch深度學習框架的增強圖像分類方案。通過先對圖像進行分割提取感興趣區域&#xff08;Region of Interest&#xff0c;R…

華為云對象存儲OBS 支持安卓/iOS/鴻蒙UTS組件

華為云對象存儲OBS 支持安卓/iOS/鴻蒙UTS組件 介紹使用前須知vue代碼調用示例權限說明API調用說明初始化配置&#xff08;openClient&#xff09;創建桶&#xff08;createBucket&#xff09;列舉桶&#xff08;listBuckets&#xff09;刪除桶&#xff08;deleteBucket&#xf…