【并發編程 | 第一篇】線程相關基礎知識

1.并發和并行有什么區別

并發是指多核CPU上的多任務處理,多個任務在同一時刻真正同時執行。

并行是指單核CPU上的多任務處理,多個任務在同一時間段內交替執行,通過時間片輪轉實現交替執行,用于解決IO密集型瓶頸。

如何理解線程安全呢?

如果一段代碼塊或者一個方法被多個線程同時并發執行,其中的共享內容還能夠有序正確的執行,就說明是線程安全的。

線程安全滿足三個要素:

原子性:一個操作如果執行要么成功,要么失敗,不會只執行一部分。

可以通過同步關鍵字 synchronized 或原?操作,如 AtomicInteger 來保證原子性。

可見性:當一個線程修改共享變量后,其他變量可以及時看到。

可以通過 volatile 關鍵字來保證可?性。

有序性:確保線程不會因為死鎖、饑餓、活鎖等問題導致無法繼續執行。

2.線程和進程的區別

進程:進程簡單點說就是我們的電腦上啟動的一個個應用,它是操作系統分配資源的最小單位。

線程:線程是進程中的獨立執行單元。多個線程可以共享一個進程的資源,如內存,每個線程都有自己獨立的棧和寄存器。

線程間是如何進行通信的?

原則上可以通過消息傳遞和共享內存兩種?法來實現。

Java 采用的是共享內存的并發模型。 這個模型被稱為 Java 內存模型,簡寫為 JMM,它決定了?個線程對共享變量的寫入,何時對另外?個線程可見。 當然了,本地內存是 JMM 的?個抽象概念,并不真實存在。

用一句話來概括就是:共享變量存儲在主內存中,每個線程的私有本地內存,存儲的是這個共享變量的副本。

線程A和線程B之間要通信,有兩個步驟:

1、線程A把本地內存A中的共享變量副本刷新到主內存中。

2、線程 B 到主內存中讀取線程 A 刷新過的共享變量,再同步到??的共享變量副本中。

3.線程有幾種創建方式?

有三種,繼承Thread類、實現Runnable接口、實現Callable接口。

第一種需要重寫父類的run()方法,并調用start()方法啟動線程。

class ThreadTask extends Thread {

????????public void run() {

????????????????System.out.println("我是繼承Thread類創建多線程");

??????}

????????public static void main(String[] args) {

????????????????ThreadTask task = new ThreadTask();

????????????????task.start();

????????}

}

這種繼承Thread類創建線程的方法缺點是,如果該類已經繼承其他類,就不能繼承Thread類了,因為Java是不支持多重繼承的。

第二種實現Runnable接口并重寫run()方法, 并且將實現類的對象作為參數傳遞給Thread類的構造方法,最后調用start()方法開啟線程。

class RunnableTask implements Runnable {

public void run() {

????????System.out.println("我是通過實現Runnable接口創建多線程");

}

public static void main(String[] args) {

????????????????RunnableTask task = new RunnableTask();

????????????????Thread thread = new Thread(task);

???????????????? thread.start();

????????}

}

這種方法的優點是避免了Java的單繼承的限制,且更加符合面向對象的編程思想,因為Runnable接口將任務代碼和線程控制的代碼解耦了。

第三種實現Callable接口并重寫call()方法,創建FutureTask對象,參數為實現Callable接口的示例對象,然后創建Thread對象,參數為FutureTask對象,最后調用start()方法啟動線程。

class CallableTask implements Callable {

public String call() {

????????return "我是通過實現Callable接口來創建多線程";

?}

public static void main(String[] args) throws ExecutionException, InterruptedException {

????????CallableTask task = new CallableTask();

????????FutureTask futureTask = new FutureTask<>(task);

????????Thread thread = new Thread(futureTask);

????????thread.start();

????????System.out.println(futureTask.get());

????????}

} ?

這種?法的優點是可以獲取線程的執?結果。

啟動一個Java程序,你能說說里面有哪些線程嗎??

首先是main線程,這是程序執行的入口

垃圾回收線程,它是一個后臺線程,負責回收不再使用的對象

編譯器線程,如JIT,負責把一部分熱點代碼編譯后放到codeCache

調用start()方法可以執行run()方法,為什么不直接調用run()方法?

當調用start()方法時,會創建一個新的線程,并異步執行run()方法。

如果直接調用run()方法,就是一個普通方法的調用,不會創建新的線程,會在當前線程下直接執行,也就無法達到多線程的目的了。

也就是說,調用start() ?法會通知 JVM,去調?底層的線程調度機制來啟動新線程。

調用start()方法后,線程處于就緒狀態,等待底層操作系統調度,一旦調度執行,就會執行run()方法中的內容。

4.線程中有哪些常用的調度方法?

如start()啟用線程等待操作系統調度執行,sleep()讓線程休眠一段時間,wait()會讓當前線程進入等待,notify()會喚醒一個正在等待的線程。

講講wait和notify方法

當線程 A 調?共享對象的 wait() ?法時,線程 A 會被阻塞掛起,直到線程 B 調用了共享對象的 notify() 方法或者 notifyAll() 方法;

其他線程調用線程A的interrupt() ?法,導致線程 A 拋出 InterruptedException 異常。

線程 A 調用共享對象的 wait(timeout) ?法后,沒有在指定的 timeout 時間內被其它線程喚醒,那么這個方法會 因為超時而返回。

當線程 A 調?共享對象的 notify() ?法后,會喚醒?個在這個共享對象上調用wait 系列方法被掛起的線程。

共享對象上可能會有多個線程在等待,具體喚醒哪個線程是隨機的。

講講sleep方法

當線程A調用了Thread的sleep方法后,線程A會暫時讓出指定時間的執行權。

指定的睡眠時間到了之后,線程A會繼續參與執行權的爭奪。

講講yield方法

yield方法是讓當前線程讓出CPU的使用權,回到就緒狀態。但是線程調度器可能會忽略。

講講Interrupt方法

interrupt() 方法用于通知線程停?,但不會直接終?線程,需要線程自行處理中斷標志。 常與 isInterrupted() 或 Thread.interrupted() 配合使用。

5.線程有幾種狀態?

一般6種,new代表線程創建并未啟動,runnable代表線程處于就緒或正在運行的狀態,由操作系統調度,blocked代表線程被阻塞,可能是獲取鎖失敗,waiting代表等待線程的通知timed_waiting

代表線程等待一段時間,超時會自動恢復,terminated 代表線程執?完畢,生命周期結束。

也就是說,線程的周期可以分為五個階段:新建,就緒,運行,阻塞,終止。線程運行時會根據狀態的變化來隨時變化。

通過一個表格對線程狀態的總結:

狀態說明
NEW當線程被創建后,如通過new Thread(),它處于新建狀態。此時,線程已經被分配了必要的資源,但還沒有開始執?
RUNNABLE當調?線程的start()?法后,線程進?可運?狀態。在這個狀態下,線程可能正在運 ?也可能正在等待獲取 CPU 時間?,具體取決于線程調度器的調度策略。
BLOCKED線程在試圖獲取?個鎖以進?同步塊/?法時,如果鎖被其他線程持有,線程將進?阻塞 狀態,直到它獲取到鎖
WAITING線程進?等待狀態是因為調?了如下?法之?:Object.wait()或 LockSupport.park()。在等待狀態下,線程需要其他線程顯式地喚醒,否則不會?動 執?
TIME_WAITING當線程調?帶有超時參數的?法時,如Thread.sleep(long millis)、 Object.wait(long timeout) 或LockSupport.parkNanos(),它將進?超時等待狀 態。線程在指定的等待時間過后會?動返回可運?狀態。
TERMINATED當線程的run()?法執?完畢后,或者因為?個未捕獲的異常終?了執?,線程進?終止狀態。?旦線程終?,它的?命周期結束,不能再被重新啟動。

?

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

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

相關文章

Kafka 偏移量

在 Apache Kafka 中&#xff0c;偏移量&#xff08;Offset&#xff09;是一個非常重要的概念。它不僅用于標識消息的位置&#xff0c;還在多種場景中發揮關鍵作用。本文將詳細介紹 Kafka 偏移量的核心概念及其使用場景。 一、偏移量的核心概念 1. 定義 偏移量是一個非負整數…

18.redis基本操作

Redis(Remote Dictionary Server)是一個開源的、高性能的鍵值對(Key-Value)存儲數據庫,廣泛應用于緩存、消息隊列、實時分析等場景。它以其極高的讀寫速度、豐富的數據結構和靈活的應用方式而受到開發者的青睞。 Redis 的主要特點 ?高性能: ?內存存儲:Redis 將所有數…

歷年跨鏈合約惡意交易詳解(一)——THORChain退款邏輯漏洞

漏洞合約函數 function returnVaultAssets(address router, address payable asgard, Coin[] memory coins, string memory memo) public payable {if (router address(this)){for(uint i 0; i < coins.length; i){_adjustAllowances(asgard, coins[i].asset, coins[i].a…

通俗易懂的講解SpringBean生命周期

&#x1f4d5;我是廖志偉&#xff0c;一名Java開發工程師、《Java項目實戰——深入理解大型互聯網企業通用技術》&#xff08;基礎篇&#xff09;、&#xff08;進階篇&#xff09;、&#xff08;架構篇&#xff09;清華大學出版社簽約作家、Java領域優質創作者、CSDN博客專家、…

深入理解 `git pull --rebase` 與 `--allow-unrelated-histories`:區別、原理與實戰指南

&#x1f680; git pull --rebase vs --allow-unrelated-histories 全面解析 在日常使用 Git 時&#xff0c;我們經常遇到兩種拉取遠程代碼的方式&#xff1a;git pull --rebase 和 git pull --allow-unrelated-histories。它們的區別是什么&#xff1f;各自適用哪些場景&…

Matlab_Simulink中導入CSV數據與仿真實現方法

前言 在Simulink仿真中&#xff0c;常需將外部數據&#xff08;如CSV文件或MATLAB工作空間變量&#xff09;作為輸入信號驅動模型。本文介紹如何高效導入CSV數據至MATLAB工作空間&#xff0c;并通過From Workspace模塊實現數據到Simulink的精確傳輸&#xff0c;適用于運動控制…

Spring Boot 中 JdbcTemplate 處理枚舉類型轉換 和 減少數據庫連接的方法 的詳細說明,包含代碼示例和關鍵要點

以下是 Spring Boot 中 JdbcTemplate 處理枚舉類型轉換 和 減少數據庫連接的方法 的詳細說明&#xff0c;包含代碼示例和關鍵要點&#xff1a; 一、JdbcTemplate 處理枚舉類型轉換 1. 場景說明 假設數據庫存儲的是枚舉的 String 或 int 值&#xff0c;但 Java 實體類使用 enu…

API 安全之認證鑒權

作者&#xff1a;半天 前言 API 作為企業的重要數字資源&#xff0c;在給企業帶來巨大便利的同時也帶來了新的安全問題&#xff0c;一旦被攻擊可能導致數據泄漏重大安全問題&#xff0c;從而給企業的業務發展帶來極大的安全風險。正是在這樣的背景下&#xff0c;OpenAPI 規范…

MATLAB繪圖配色包說明

本欄目將分享MATLAB數據分析圖表&#xff0c;該貼講述配色包的使用 將配色包colormap_nclCM文件夾添加到路徑close all&#xff08;盡量不要刪&#xff09;&#xff0c;使用map colormap(nclCM(309))時會多出來一張空白圖片。配色資源來自slandarer&#xff1b;找不到合適顏色…

Oracle 數據庫系統全面詳解

Oracle 數據庫是全球領先的關系型數據庫管理系統(RDBMS)&#xff0c;由 Oracle 公司開發。它為企業級應用提供了高性能、高可用性、安全性和可擴展性的數據管理解決方案。 目錄 一、Oracle 數據庫體系結構 1. 物理存儲結構 主要組件&#xff1a; 存儲層次&#xff1a; 2. …

Flink介紹——發展歷史

引入 我們整個大數據處理里面的計算模式主要可以分為以下四種&#xff1a; 批量計算&#xff08;batch computing&#xff09; MapReduce Hive Spark Flink pig流式計算&#xff08;stream computing&#xff09; Storm SparkStreaming/StructuredStreaming Flink Samza交互計…

在MFC中使用Qt(四):使用屬性表(Property Sheet)實現自動化Qt編譯流程

前言 首先回顧下前面文章介紹的&#xff1a; 在MFC中使用Qt&#xff08;一&#xff09;&#xff1a;玩膩了MFC&#xff0c;試試在MFC中使用Qt&#xff01;&#xff08;手動配置編譯Qt&#xff09; 在MFC中使用Qt&#xff08;二&#xff09;&#xff1a;實現Qt文件的自動編譯流…

Go紅隊開發— 收官工具

文章目錄 免責聲明個人武器開發美觀輸出Whois查詢反查ip目錄掃描子域名爆破被動掃描主動掃描(字典爆破)CDN檢測 免責聲明 &#x1f4a1; 本博客絕不涉及任何非法用途。 &#x1f4a1; 使用者風險自擔&#xff0c;違規后果自負。 &#x1f4a1; 守法為先&#xff0c;技術向善。 …

論文閱讀《P?roximal Curriculum for Reinforcement Learning Agents》——提升智能體學習速度的

老規矩&#xff0c;今天是使用Gemini2.5pro來生成的模板 這篇論文研究了如何為處理多個相關任務的強化學習智能體自動設計學習課程&#xff08;即任務順序&#xff09;&#xff0c;以加速訓練過程&#xff0c;并解決現有方法需要大量調參或缺乏理論依據的問題。為此&#xff0…

【面試題】在 CSS 中,實現一個 div 中的子 div 水平垂直居中

1. 使用 Flexbox 特點&#xff1a;簡單、直觀&#xff0c;現代瀏覽器支持良好。 代碼&#xff1a; css .parent {display: flex;justify-content: center; /* 水平居中 */align-items: center; /* 垂直居中 */height: 200px; /* 父容器需有高度 */ } .child {…

基于SpringBoot的失物招領平臺(源碼+數據庫)

476基于SpringBoot的失物招領平臺&#xff0c;有用戶和管理員兩個角色&#xff0c;主要功能如下 失物招領系統功能介紹如下&#xff1a; 1. 用戶功能&#xff1a; - 發布失物公告&#xff1a;用戶可以發布自己的失物信息 - 失物分類&#xff1a;用戶可以根據失物的類型進行分類…

PyQt6實例_批量下載pdf工具_批量pdf網址獲取

目錄 前置&#xff1a; 步驟&#xff1a; step one 安裝包 step two 獲取股票代碼 step three 敲代碼&#xff0c;實現 step four 網址轉pdf網址 視頻 前置&#xff1a; 1 本系列將以 “PyQt6實例_批量下載pdf工具”開頭&#xff0c;放在 【PyQt6實例】 專欄 2 本節講…

量子退火與機器學習(2):少量實驗即可找到新材料,黑盒優化?量子退火

使用量子退火和因子分解機設計新材料 這篇文章是東京大學的一位博士生的畢業論文中的主要貢獻。 結合了黑盒優化和量子退火&#xff0c;是融合的非常好的一篇文章&#xff0c;在此分享給大家。 https://journals.aps.org/prresearch/abstract/10.1103/PhysRevResearch.2.0133…

從零開始:Makefile 與 CMake 的基礎入門與實踐

本文適合基礎學者 零基礎 makefile 定義&#xff1a;Makefile 是一種傳統的構建工具&#xff0c;用于定義如何編譯和鏈接源代碼。它通過一系列規則來描述如何生成目標文件&#xff08;如可執行文件或庫&#xff09;。 功能&#xff1a;定義編譯規則&#xff08;如如何從源文件…

android開啟Sys V IPC,并使用共享內存編程

參考&#xff1a;安卓開啟Sys V IPC&#xff0c;并使用共享內存編程 | 久奈浜的CS部 刪除config中-# CONFIG_SYSVIPC is not set 在rk3576.config中增加CONFIG_SYSVIPCy CONFIG_SYSVIPCy CONFIG_SYSVIPC_SYSCTLy CONFIG_SYSVIPC_COMPATy CONFIG_IPC_NSy system/sepolicy/pre…