你需要知道關于 Java 線程一些最基本的事情

你好,我是 shengjk1,多年大廠經驗,努力構建 通俗易懂的、好玩的編程語言教程。 歡迎關注!你會有如下收益:

  1. 了解大廠經驗
  2. 擁有和大廠相匹配的技術等

希望看什么,評論或者私信告訴我!

文章目錄

  • 一、前言
  • 二 線程
    • 2.1 進程和線程關系
    • 2.2 為什么需要線程
    • 2.3 線程的狀態
    • 2.4 如何創建線程
    • 2.5 線程停止
      • 2.5.1 使用標識
      • 2.5.2 使用 interrup()
  • 三、總結


一、前言

線程算是相對較高級的內容,主要的原因不是說他難,而是它不可見。最近基于多線程的方式優化了一些 FLink 程序,所以這一系列,我們聊聊多線程

二 線程

2.1 進程和線程關系

圖片.png

進程是計算機系統進行資源分配和調度的最小單位,換句話說我們平時雙擊那些后綴為 .exe的文件時都會產生一個進程。

進程可以產生若干個線程,是程序執行的最小單位,換句話說,進程就是房子,線程就是房子內一個個干活的人

2.2 為什么需要線程

線程在計算機編程中扮演著重要角色,其重要性主要體現在以下幾個方面:

  1. 提高程序響應性:通過多線程處理,程序可以變得更加靈活和響應更加及時。在一個單線程程序中,如果有一個耗時的操作,會導致整個程序阻塞,影響用戶體驗;而多線程可以使程序保持活躍,允許其他線程繼續執行,從而提高程序的響應性。
  2. 提高程序性能:多線程可以充分利用多核處理器的優勢,實現并發執行多個任務,加快程序運行速度,提高系統整體性能。通過并行執行,程序可以更有效地利用計算資源,加快任務完成的速度。
  3. 實現并發處理:多線程允許程序同時執行多個任務,這對于需要同時處理多個事件或任務的應用程序至關重要。例如,在服務器端應用中,多線程可以同時處理多個客戶端請求。
  4. 資源共享:多個線程可以共享進程的資源,如內存空間、文件句柄等,這種資源共享有助于簡化程序設計,并提高效率。不同線程之間可以相互通信、共享數據,協同工作來完成復雜任務。
  5. 實現復雜邏輯:有些程序需要同時進行多項任務,通過多線程可以更好地組織和管理復雜的邏輯,提高程序的可維護性和可拓展性。
  6. 實現異步編程:多線程可以實現異步操作和事件驅動,允許程序在等待某些操作完成時繼續執行其他操作,提高程序的效率和靈活性。異步編程模型通過非阻塞方式進行任務處理,可以有效提升程序的吞吐量和性能。 綜合以上原因,線程在計算機編程中是不可或缺的,它提供了一種有效的機制來實現并發處理、提高程序的響應性和性能、實現資源共享以及管理復雜的程序邏輯。因此,了解和靈活運用線程是提升程序效率和優化系統性能的重要手段。

2.3 線程的狀態

public enum State {/*** Thread state for a thread which has not yet started.*/NEW,/*** Thread state for a runnable thread.  A thread in the runnable* state is executing in the Java virtual machine but it may* be waiting for other resources from the operating system* such as processor.*/RUNNABLE,/*** Thread state for a thread blocked waiting for a monitor lock.* A thread in the blocked state is waiting for a monitor lock* to enter a synchronized block/method or* reenter a synchronized block/method after calling* {@link Object#wait() Object.wait}.*/BLOCKED,/*** Thread state for a waiting thread.* A thread is in the waiting state due to calling one of the* following methods:* <ul>*   <li>{@link Object#wait() Object.wait} with no timeout</li>*   <li>{@link #join() Thread.join} with no timeout</li>*   <li>{@link LockSupport#park() LockSupport.park}</li>* </ul>** <p>A thread in the waiting state is waiting for another thread to* perform a particular action.** For example, a thread that has called <tt>Object.wait()</tt>* on an object is waiting for another thread to call* <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on* that object. A thread that has called <tt>Thread.join()</tt>* is waiting for a specified thread to terminate.*/WAITING,/*** Thread state for a waiting thread with a specified waiting time.* A thread is in the timed waiting state due to calling one of* the following methods with a specified positive waiting time:* <ul>*   <li>{@link #sleep Thread.sleep}</li>*   <li>{@link Object#wait(long) Object.wait} with timeout</li>*   <li>{@link #join(long) Thread.join} with timeout</li>*   <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>*   <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>* </ul>*/TIMED_WAITING,/*** Thread state for a terminated thread.* The thread has completed execution.*/TERMINATED;
}

2.4 如何創建線程

Thread thread = new Thread();
thread.start();

在Java中,當調用線程對象的start()方法時,實際上是調用了start0()方法,該方法會啟動一個新的本地操作系統線程,
然后調用Java中的run()方法來執行線程的任務。所有 線程的主要工作的方法就是 run 方法,那么怎么樣來豐富 run 方法的內容呢?

首先通過匿名內部類來啟動線程,如:

Thread thread1 = new Thread(){@Overridepublic void run() {while (true){if (Thread.currentThread().isInterrupted()){System.out.println("Interruted!");break;}Thread.yield();try {TimeUnit.SECONDS.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("thread1==");}}
} ;thread1.start();

當然也可以實現 Runnable 接口來實現線程的功能

public class CreateThread3 implements Runnable {public static void main(String[] args) {Thread t1 = new Thread(new CreateThread3());t1.start();}@Overridepublic void run() {System.out.println("Oh,I am Runnable");}}

2.5 線程停止

2.5.1 使用標識

public class ControlledThread extends Thread {private volatile boolean shouldStop = false;public void stopThread() {shouldStop = true;}@Overridepublic void run() {while (!shouldStop) {// 線程執行的任務System.out.println("Thread is running...");}System.out.println("Thread stopped.");}public static void main(String[] args) {ControlledThread thread = new ControlledThread();thread.start();// 模擬停止線程try {Thread.sleep(3000); // 等待3秒} catch (InterruptedException e) {e.printStackTrace();}thread.stopThread();}
}

需要注意的是,這里使用 volatile 變量來保證該變量對于任意線程可見,如果不用 volatile 的話,則線程可能會無法停止

2.5.2 使用 interrup()

public class InterruptedThread extends Thread {@Overridepublic void run() {while (!Thread.interrupted()) {// 線程執行的任務System.out.println("Thread is running...");}System.out.println("Thread stopped.");}public static void main(String[] args) {InterruptedThread thread = new InterruptedThread();thread.start();// 模擬停止線程try {Thread.sleep(3000); // 等待3秒thread.interrupt(); // 中斷線程} catch (InterruptedException e) {e.printStackTrace();}}
}

三、總結

文章圍繞多線程的核心概念和應用展開,通過具體Java代碼示例,深入講解了線程的創建、狀態管理以及線程停止的方法。作者強調了線程在優化程序性能和響應性方面的重要性,鼓勵讀者深入了解并靈活運用多線程編程技術

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

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

相關文章

百度云下載不限速方式集合

使用解析網站配合Motrix工具軟件 下載Motrix工具&#xff1a;Motrix下載鏈接打開解析網址&#xff1a;解析網站獲取&#xff0c;將百度網盤鏈接粘貼到解析網站&#xff0c;獲取下載鏈接。在Motrix中配置Aria2 RPC地址&#xff1a;ws://localhost:16800/jsonrpc開始下載&#x…

《SpringBoot3+Vue3實戰》系列文章目錄

前后端分離&#xff08;Frontend-Backend Separation&#xff09;是一種軟件架構設計模式&#xff0c;它將傳統的Web應用中的前端&#xff08;用戶界面&#xff09;和后端&#xff08;服務器邏輯和數據存儲&#xff09;從應用層面進行解耦&#xff0c;使得兩者可以獨立地開發、…

stm32標準庫usart1,usrat2,usart3三個串口的配置以及printf重定向(串口輸出)

我剛開始學串口時&#xff0c;因為要用到多個串口&#xff0c;自己又懶得改&#xff0c;總是在網上要找半天。下面將stm32的三個串口配置羅列下來&#xff0c;方便大家直接copy。 1、串口1 引腳&#xff1a;TX&#xff1a;PA9&#xff1b; RX&#xff1a;PA10&#xff1b; 重…

Deno入門:Node.js的現代替代品

Deno 作為 Node.js 的現代替代品&#xff0c;提供了許多改進和創新&#xff0c;尤其是在安全性、模塊系統和開發體驗方面。雖然它仍處于發展階段&#xff0c;但對于尋求簡潔、安全和現代化 JavaScript/TypeScript 開發環境的開發者來說&#xff0c;Deno 是一個值得考慮的選擇。…

【封裝】Unity切換場景不銷毀物體

在切換場景時&#xff0c;如果物體不需要銷毀&#xff0c;可以直接使用下方腳本 代碼 public class DontDestroyLoader : MonoBehaviour{ //所有不銷毀的物體預制體[SerializeField] private GameObject[] dontDestroyPrefabs;//實例化預制體public void Load(){foreach (var …

Linux CFS調度器簡介

文章目錄 前言一、概要二、實現2.1 簡介2.2 算法實現2.3 內核源碼 三、特點四、調度策略五、調度類參考資料 前言 早期的Linux調度器采用了簡化的設計&#xff0c;顯然并不針對具有許多處理器甚至超線程的大規模架構。Linux 1.2調度器使用循環隊列對可運行任務進行管理&#x…

flink實戰--大狀態任務調優指南

Flink 狀態(State)簡介 在 Flink 中,狀態管理是流處理應用的核心概念之一,它允許算子(operators)在處理事件時保持和操作狀態信息。在 Flink 中,狀態可以被視為算子的“記憶”,它使得算子能夠在處理無界流數據時保持對歷史數據的跟蹤。狀態可以是簡單的鍵值對,也可以是…

昆侖萬維官宣開源2000億稀疏大模型Skywork-MoE

6月3日&#xff0c;昆侖萬維宣布開源2千億稀疏大模型Skywork-MoE&#xff0c;性能強勁&#xff0c;同時推理成本更低。 據「TMT星球」了解&#xff0c;Skywork-MoE基于之前昆侖萬維開源的Skywork-13B模型中間checkpoint擴展而來&#xff0c;是首個完整將MoE Upcycling技術應用…

北京Profinet轉Modbus網關配置調試詳解

一、背景&#xff1a;在工業自動化系統中&#xff0c;PLC&#xff08;可編程邏輯控制器&#xff09;與流量計之間的通信是非常重要的&#xff0c;以確保數據準確傳輸并實現控制功能。然而&#xff0c;由于PLC和流量計可能采用不同的通信協議&#xff08;如Profinet和Modbus&…

探索Java的DNA-JVM字節碼深度解析

引言 在Java的世界里&#xff0c;JVM&#xff08;Java虛擬機&#xff09;是我們程序運行的心臟。而字節碼&#xff0c;作為JVM的血液&#xff0c;攜帶著程序的執行指令。今天&#xff0c;我們將深入探索Java字節碼的奧秘&#xff0c;一窺JVM如何將人類可讀的代碼轉化為機器可執…

洛谷 P1438 無聊的數列

題意 給定一個序列 A ( A 1 , A 2 , ? , A n ) A(A_1,A_2,\cdots,A_n) A(A1?,A2?,?,An?)。 現在進行 m m m次操作&#xff0c;分為以下兩種: 1 l r k d&#xff1a;給定一個長度為 r ? l 1 r-l1 r?l1的等差序列&#xff0c;首項為 k k k&#xff0c;公差為 d d d&am…

【小白向】微信小程序解密反編譯教程

# 前言 最近筆者有做到微信小程序的滲透測試&#xff0c;其中有一個環節就是對微信小程序的反編譯進行源碼分析&#xff0c;所謂微信小程序反編譯&#xff0c;就是將訪問的小程序進行反向編譯拿到部分源碼&#xff0c;然后對源碼進行安全審計&#xff0c;分析出其中可能存在的…

圖形學初識--顏色混合

文章目錄 前言正文為什么要有顏色混合&#xff1f;顏色混合常見實現方式&#xff1f;上述顏色混合注意點 結尾&#xff1a;喜歡的小伙伴點點關注贊哦! 前言 本章節補充一下顏色混合的內容&#xff0c;主要包含&#xff1a;為什么要有顏色混合&#xff1f;顏色混合常實現方式&a…

BGP——邊界網關路由協議

BGP -邊界網關路由協議 OSPF RIP EIGRP AS——自治系統 標準編號16位二進制 0-65535 1-64511公有 64512 -私有 擴展編號 32位二進制 動態路由協議: GP ——內部網關路由協議 —— AS之內 或企業網、局域網 RIP OSPF EIGRP EGP-外部網關路由協議 - …

Centos 7 安裝刻錄至硬件服務器

前言 在日常測試中&#xff0c;會遇到很多安裝的場景&#xff0c;今天給大家講一下centos 7 的安裝&#xff0c;希望對大家有所幫助。 一.下載鏡像 地址如下&#xff1a; centos官方鏡像下載地址https://www.centos.org/download/ 按照需求依次點擊下載 二.鏡像刻錄 鏡像刻…

idea springboot woff/woff2/eot/ttf/svg等小圖標不顯示的問題 - 第515篇

歷史文章&#xff08;文章累計500&#xff09; 《國內最全的Spring Boot系列之一》 《國內最全的Spring Boot系列之二》 《國內最全的Spring Boot系列之三》 《國內最全的Spring Boot系列之四》 《國內最全的Spring Boot系列之五》 《國內最全的Spring Boot系列之六》 《…

Shopify 獨立站監控觀測最佳實踐

Shopify 簡介 Shopify 是一個全球領先的電子商務平臺&#xff0c;它為商家提供了一整套在線商店解決方案。自 2006 年成立以來&#xff0c;Shopify 已經幫助數百萬商家在全球范圍內建立和發展他們的在線業務。 監控觀測 Shopify 站點對于確保業務連續性、優化用戶體驗和提高運…

python虛擬環境venv的安裝--ubuntu

venv是Python內置的虛擬環境管理工具 1.安裝python3-venv包&#xff1a; sudo apt install python3.12-venv2.創建虛擬環境&#xff08;在項目目錄下&#xff09; python3 -m venv venv3. 激活虛擬環境&#xff1a; source venv/bin/activate4.在虛擬環境中安裝所需的庫&am…

Linux shell編程學習筆記56:date命令——顯示或設置系統時間與日期

0 前言 2024年的網絡安全檢查又開始了&#xff0c;對于使用基于Linux的國產電腦&#xff0c;我們可以編寫一個腳本來收集系統的有關信息。在收集的信息中&#xff0c;應該有一條是搜索信息的時間。 1. date命令 的功能、格式和選項說明 我們可以使用命令 date --help 來查看 d…