JavaEE-多線程實戰01

Java 多線程入門:第一個多線程程序

在 Java 中,多線程編程是非常重要的一部分。本篇文章將通過示例,帶你快速了解如何創建第一個多線程程序,并深入分析其運行機制。


1. 創建一個線程類并繼承 Thread

在 Java 中,我們可以通過繼承 Thread 類并重寫其中的 run() 方法,來定義一個自己的線程行為。
來看第一個示例:

package thread.test;//1.創建一個自己的類,繼承自這個Thread
class MyThread extends Thread {@Overridepublic void run() {//run方法就是這個線程的入口方法,類似于main()System.out.println("hello world");}
}public class ThreadDemo1 {public static void main(String[] args) {//2.根據自定義的類創建出實例(線程實例才是真正的線程)//也可以用MyThread t=new MyThread();Thread thread=new MyThread();//3.調用Thread的start方法,才會真正調用系統api,在系統內核中創建出線程//使用Thread會創建出線程,而直接使用run的話就不會thread.start();}
}

運行結果

2. 代碼分析

當你調用 thread.start() 時,真正開辟了一個新的線程,系統會去執行 MyThread 類的 run() 方法里的代碼(即打印 "hello world")。
注意,調用的是 start() 方法,而不是直接調用 run(),這是兩者最關鍵的區別!

  • start() 方法通知系統啟動一個新線程,不會阻塞當前主線程。

  • run() 方法只是一個普通的方法調用,不會開啟新的線程。

所以,main() 方法會快速執行完,而子線程仍在后臺執行。主線程和子線程各自獨立運行。


3. 再舉一個例子:多線程并發執行

來看另一個簡單示例,理解并發執行的效果:

public class Example {public static void main(String[] args) {MyThread t = new MyThread();t.start();System.out.println("main線程結束了");}
}
class MyThread extends Thread {@Overridepublic void run() {System.out.println("我是子線程");}
}

可能輸出結果是:

也可能輸出的結果是:

為什么會有兩種可能??

因為多線程執行是并發的,誰先執行完是不確定的,由操作系統線程調度器決定。


4. 小知識:守護線程(Daemon Thread)

在 Java 中,普通線程會阻止整個程序結束。而守護線程不會。
整個進程(整個程序)是不是結束,要看有沒有別的 非守護線程 還在運行

具體來說:

  • 如果還有其他普通線程(非守護線程)在運行,進程不會結束

  • 只有當所有非守護線程都結束以后,整個 Java 進程才真正結束。

  • 守護線程(daemon thread)不會阻止進程結束(守護線程就像后臺服務一樣,進程結束了它也跟著掛了)。

如果你希望讓子線程是“守護線程”,可以這樣寫:

MyThread thread = new MyThread();
thread.setDaemon(true);  // 設置成守護線程
thread.start();

這樣,當主線程執行完畢后,即使子線程還沒跑完,整個進程也會直接結束

注意:setDaemon(true) 必須在 start() 之前調用,否則會拋異常!


Java 多線程入門:第二個多線程程序

接下來,我們來寫一個持續運行的線程,看看主線程和子線程如何同時運行、輪流輸出內容。


5. 代碼示例:兩個線程同時輸出內容

package thread.test;class MyThread2 extends Thread {@Overridepublic void run() {while (true) {System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}
public class ThreadDemo2 {public static void main(String[] args) {Thread t=new MyThread2();t.start();while (true) {System.out.println("hello main");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}

執行結果

代碼分析

6. 代碼分析

  • MyThread2 是一個自定義線程類,重寫了 run() 方法。

  • 子線程每隔 1 秒輸出一次 "hello thread"

  • 主線程(main 方法)每隔 1 秒輸出一次 "hello main"

運行效果示例:

由于是兩個獨立的線程,它們的輸出順序和精確時間點可能不一樣,比如:

??? 有時先看到 "hello main"

??? 有時先看到 "hello thread"

這種不確定性就是并發執行的本質特征!

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

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

相關文章

Android Compose 無網絡狀態處理全指南:從基礎到高級實踐

Android Compose 無網絡狀態界面處理全方案 引言 在移動應用開發中,網絡連接不穩定是常見場景。優雅地處理無網絡狀態能顯著提升用戶體驗。Jetpack Compose 提供了強大的工具來實現各種網絡狀態下的界面展示。本文將全面介紹在 Compose 中處理無網絡狀態的多種方案…

Arduino項目實戰與編程技術詳解

一、智能避障小車:超聲波傳感器與PWM電機控制 1.1 硬件需求與工作原理 智能避障小車的核心在于超聲波傳感器與電機驅動模塊的協同工作。超聲波傳感器(HC-SR04)通過發射高頻聲波并接收回波來測量距離,而L298N電機驅動模塊則負責控制兩個直流電機的轉向與速度。 1.1.1 超聲…

Java在云計算、大數據、云原生下的應用和優勢 - 面試實戰

Java在云計算、大數據、云原生下的應用和優勢 - 面試實戰 第一輪提問 面試官:馬架構,請簡單介紹一下Java在云計算中的主要應用場景有哪些? 馬架構:Java在云計算中的主要應用場景包括微服務架構設計、容器化部署(如D…

數據庫與大數據技術教程資料

概述 無論你是剛入門的技術新人,還是尋求突破的資深工程師,這份精心整理的電子書合輯將為你打開系統性學習的大門!所有資源支持多端閱讀,助力技術成長每一步資料已經整理好,喜歡的朋友請自取:https://pan.…

【Spring Boot 注解】@ConfigurationProperties

文章目錄 ConfigurationProperties注解一、簡介二、依賴引入三、基本用法四、主要特性五、激活方式六,優點七、與 Value 對比 ConfigurationProperties注解 一、簡介 ConfigurationProperties 是 Spring Boot 提供的一個強大注解,用于將外部配置&#…

C++(初階)(十六)——set

set setset介紹set的構造和迭代器set的增刪查findlower_boundmultiset和set的差異 題目[349. 兩個數組的交集 - 力扣(LeetCode)](https://leetcode.cn/problems/intersection-of-two-arrays/description/)交集差集[142. 環形鏈表 II - 力扣(L…

higress之:讓流量通過gateway

本來想測跨域問題,結果參數配置過去之后一直沒生效,經過了解說是gateway才是設置跨域參數的核心,所以需要讓流量通過gateway,搗鼓了半天記錄一下 第一步,測試服務是否正常 通過get svc、pod等,發現各pod都…

C盤哪些文件刪除之后無影響,可以清理磁盤空間。

C盤是電腦的系統盤,存放了操作系統的重要文件和部分默認安裝的軟件。當C盤空間不足時,系統可能運行緩慢甚至卡頓,這時清理C盤是一個有效的解決方法。由于C盤包含許多關鍵數據,清理時需要格外謹慎,以免誤刪導致系統崩潰。將詳細介紹C盤中可以安全刪除的文件類型及清理方法,…

開源項目實戰學習之YOLO11:ultralytics-cfg-models-fastsam(九)

👉 點擊關注不迷路 👉 點擊關注不迷路 👉 點擊關注不迷路 文章大綱 1. __init__.py2. model.py3. predict.py4. utils.py5. val.py FastSAM 是一種目標檢測和圖像分割模型,Ultralytics 是一個在計算機視覺領域廣泛使用的庫&#x…

Windows11安裝Docker

本次安裝環境 Windows11(23H2),CPU(12代Intel) 什么是Docker Docker 是一個軟件平臺,讓您可以快速構建、測試和部署應用程序。Docker 將軟件打包成名為容器的標準化單元,這些單元具有運行軟件所…

C# 在VS2022中開發常用設置

一、基礎環境配置 1. 安裝必要組件 在 VS2022 安裝時確保勾選以下工作負載: ??使用 .NET 的桌面開發??(包含 WPF/WinForms)??ASP.NET 和 Web 開發????.NET 跨平臺開發????Azure 開發????數據存儲和處理?? 2. 主題與外…

k8s的volume

一、volume介紹 volume是Pod中能夠唄多個容器訪問的共享目錄。Kubernetes的Volume概念、用途和目的與Docker的Volume比較類似,但兩者不能等價。首先,Kubernetes中的Volume定義在Pod上,然后被一個Pod里的多個容器掛載到具體的文件目錄下;其次,Kubernetes中的Volume與Pod的生…

Java 未來技術棧:從云原生到 AI 融合的企業級技術演進路線

一、云原生架構:重構 Java 應用的運行范式 1.1 微服務架構的深度進化 Java 在微服務領域的實踐正從 Spring Cloud 向服務網格(Service Mesh)演進。以 Istio 為代表的服務網格技術,通過 Sidecar 模式實現服務間通信的透明化管理&…

阿里云 ECS 服務器進階指南:存儲擴展、成本優化與架構設計

一、彈性存儲架構:塊存儲深度解析與掛載實踐 (一)塊存儲類型與技術特性 阿里云塊存儲作為 ECS 核心存儲方案,提供三種主流類型: ESSD 云盤 性能等級:PL0/PL1/PL2/PL3,最高支持 100 萬 IOPS …

centos 安裝jenkins

centos 安裝jenkins 在 CentOS 上安裝 Jenkins 是一個相對直接的過程。以下是一個逐步指南,幫助你安裝 Jenkins: 步驟 1:安裝 Java Jenkins 需要 Java 運行環境,因此首先確保你的系統上安裝了 Java。你可以使用以下命令來安裝 …

十三種物聯網/通信模塊綜合對比——《數據手冊--物聯網/通信模塊》

物聯網/通信模塊 名稱 功能 應用場景 USB轉換模塊 用于將USB接口轉換為其他類型的接口,如串口、并口等,實現不同設備之間的通信。 常用于計算機與外部設備(如打印機、掃描儀等)的連接,以及數據傳輸和設…

【基礎知識】常見的計算公式(二)

目錄標題 一、ADC(模擬 - 數字轉換器)相關公式1. ADC 分辨率計算2. ADC 轉換結果對應的模擬電壓計算 二、DAC(數字 - 模擬轉換器)相關公式1. DAC 輸出電壓計算 三、SPI(串行外設接口)相關公式1. SPI 數據傳…

DeepSeek V1:初代模型的架構與性能

DeepSeek V1(又稱DeepSeek-MoE)是DeepSeek系列的首代大規模語言模型,它采用Transformer結合稀疏混合專家(MoE)的創新架構,實現了在受控算力下的大容量模型。本文將深入解析DeepSeek V1的架構設計與技術細節,包括其關鍵機制、訓練優化策略,以及在各類NLP任務上的表現。 …

【計算機網絡】面試常考——GET 和 POST 的區別

GET 和 POST 的區別 GET 和 POST 是 HTTP 協議中最常用的兩種請求方法,它們的主要區別體現在 用途、數據傳輸方式、安全性、緩存機制 等方面。以下是詳細對比: 1. 用途 GET POST 主要用于 獲取數據(如查詢、搜索)。 主要用于 提…

Elastic Security 8.18 和 9.0 中的新功能

作者:來自 Elastic Mark Settle, Tamarian Del Conte, James Spiteri, Tinsae Erkailo, Charles Davison, Raquel Tabuyo, Kseniia Ignatovych, Paul Ewing, Smriti 檢測規則的自動遷移、用于 ES|QL 的 Lookup Join、AI 功能增強,以及更多功能。 Elasti…