Java線程基礎面試復習筆記

1. 線程與進程的區別

線程與進程

進程是正在運行程序的實例,線程是進程中的執行單元。主要區別:

  • 內存空間:不同進程使用不同的內存空間,同一進程下的線程共享內存空間
  • 資源開銷:線程更輕量,線程上下文切換成本比進程上下文切換低
  • 通信方式:線程間通信更簡單(共享內存),進程間通信需要特殊機制(IPC)

2. 并發與并行

  • 并發(Concurrency):同一時間應對多件事情的能力,多個線程輪流使用CPU資源
  • 并行(Parallelism):同一時間動手做多件事情的能力,多核CPU同時執行多個線程

補充:并發是邏輯上的同時發生,并行是物理上的同時發生

3. 創建線程的方式

四種主要方式:

  1. 繼承Thread類 - 重寫run()方法
  2. 實現Runnable接口 - 實現run()方法(推薦,避免單繼承限制)
  3. 實現Callable接口 - 實現call()方法,有返回值
  4. 線程池創建 - 項目中推薦使用方式

Runnable vs Callable:

  • Runnable的run()方法無返回值,Callable的call()方法有返回值
  • Callable可以拋出異常,Runnable的異常只能內部處理
  • Callable需要配合FutureTask獲取結果

4. run()與start()的區別

  • start():啟動線程,由JVM調用run()方法,只能調用一次
  • run():封裝線程執行的代碼,可以被調用多次,直接調用run()不會創建新線程

5. 線程狀態及轉換

進程狀態

六種狀態:

  • NEW(新建):線程對象創建,未調用start()
  • RUNNABLE(可運行):調用start()后,包括就緒和運行狀態
  • BLOCKED(阻塞):等待獲取synchronized鎖
  • WAITING(等待):調用wait()、join()等方法,無限期等待
  • TIMED_WAITING(超時等待):調用sleep()、wait(timeout)等方法
  • TERMINATED(終止):線程執行完畢或異常終止

狀態轉換關鍵點:

  • 獲取鎖失敗 → BLOCKED狀態
  • wait()方法 → WAITING狀態,notify()/notifyAll()喚醒
  • sleep()方法 → TIMED_WAITING狀態,時間到自動喚醒

6. 線程執行順序控制

使用join()方法保證順序執行:

T1.start();
T1.join(); // 等待T1執行完
T2.start();
T2.join(); // 等待T2執行完
T3.start();

補充:還可以使用CountDownLatch、CyclicBarrier等同步工具

7. notify()與notifyAll()

  • notify():隨機喚醒一個等待的線程
  • notifyAll():喚醒所有等待的線程

面試技巧:通常推薦使用notifyAll()避免死鎖風險

8. wait()與sleep()的區別

相同點:
都會讓當前線程暫時放棄CPU使用權,進入阻塞狀態

關鍵區別:

  • 歸屬不同:sleep()是Thread的靜態方法,wait()是Object的實例方法
  • 鎖的處理:wait()會釋放對象鎖,sleep()不會釋放鎖
  • 喚醒方式:wait()可被notify()喚醒,sleep()只能等時間到或被interrupt()
  • 使用條件:wait()必須在synchronized塊中使用,sleep()無此限制

9. 停止線程的方法

三種方式:

  1. 使用標志位:設置boolean變量控制run()方法退出(推薦)
  2. interrupt()方法
    • 打斷阻塞線程(sleep/wait/join)會拋出InterruptedException
    • 打斷正常線程,通過檢查中斷狀態決定是否退出
  3. stop()方法:已廢棄,不推薦使用

最佳實踐:

// 標志位方式
private volatile boolean running = true;
public void run() {while (running) {// 執行任務}
}// interrupt方式
public void run() {while (!Thread.currentThread().isInterrupted()) {// 執行任務}
}

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

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

相關文章

面試題(技術面+hr面)

面試技術面HR面后端HR面常見問題*穩定性,上進心,目標感,抗壓能力,學習能力*回答問題時注意體現上面五點,即使瞎扯也盡量往上靠。面經項目相關介紹一下你收獲最大的一個項目你們團隊有多少人,怎么分工的開發…

本地部署Dify教程

克隆 Dify 代碼倉庫克隆 Dify 源代碼至本地。git clone hts://github.com/langgenius/dify.git啟動 Dify進入 Dify 源代碼的 docker 目錄,執行一鍵啟動命令:cd dify/docker #切換到指定目錄 cp .env.example .env #修改文件名 docker compose up -d #啟動

Android Kotlin 協程全面指南

協程是 Kotlin 提供的一套簡化異步編程的輕量級線程操作框架,特別適合 Android 開發中的異步任務處理。以下是 Android 開發中需要掌握的協程核心知識點:1. 協程基礎概念1.1 協程是什么輕量級線程:比線程更高效,可以在單個線程中運…

【Linux】進程切換與優先級

前言: 上文我們講到了操作系統與Linux中進程的狀態【Linux】進程狀態-CSDN博客 本文我們來講進程的優先級、以及進程的切換 進程優先級 什么是優先級? CPU中資源是有限的,而進程的數量一定是遠大于CPU資源的,所以優先級是進程得…

首發即開源!DAWorkBench數據可視化分析軟件正式發布!(附源碼下載網址)

1 系統介紹DAWorkBench是一款面向科研實驗和工程測試場景的數據可視化分析開源軟件,支持實現數據清洗、信號處理和交互式可視化等功能。系統集成文件IO、數據處理以及可視化交互三大模塊,支持多維數據分析與高質量圖表生成,助力用戶高效完成從…

Android Studio歷史版本快速下載(二次修改記錄)

原版:Android Studio歷史版本快速下載_android studio 歷史版本下載-CSDN博客 一. 最新版本 https://developer.android.com/studio?hlzh-cn 二. 歷史版本 中國官網的歷史版本為何不能下載?(https://developer.android.com/studio/archi…

The Missing Semester of Your CS Education 學習筆記以及一些拓展知識(六)

文章目錄The Missing Semester of Your CS Education 學習筆記以及一些拓展知識版本控制Git筆記部分Git的基本工作原理Git 的核心工作原理:快照而非差異Git 的三大工作區域Git的核心對象Git的四個對象對象之間的關系與工作流程:對象的引用Git的安裝和基礎…

嵌入式與 Linux 系統中的核心圖形庫全解析

嵌入式與 Linux 系統中的核心圖形庫全解析 圖形庫在嵌入式系統與 Linux 桌面系統中扮演著重要角色。從最底層的 GPU 驅動接口,到上層的圖形渲染與 GUI 工具包,共同構成了完整的圖形顯示棧。本文將系統整理圖形相關的核心組件,按功能分層分類&…

深度學習模塊實踐手冊(第十二期)

56、Ghost 模塊論文《GhostNet: More Features from Cheap Operations》1、作用: Ghost 模塊是一種輕量級的特征提取模塊,旨在通過廉價操作生成更多特征圖,減少計算量的同時保持模型性能。傳統卷積神經網絡在生成特征圖時存在大量冗余計算&am…

自己動手造輪子:如何創建JAR并通過Maven在Spring Boot中引用

讓代碼復用變得簡單優雅——3分鐘學會封裝專屬工具庫作為Java開發者,你是否遇到過這些痛點?多個項目重復編寫相同工具類工具代碼分散難以統一維護團隊協作缺乏標準化工具庫本文將手把手教你創建自己的JAR包,并優雅地集成到Spring Boot項目中&…

使用dea工具 給vue 里面的ts打斷點

在 Vue 項目中使用 TypeScript 時,我們通常會在 IDE(如 JetBrains 的 IntelliJ IDEA 或 WebStorm)中設置斷點進行調試。以下是詳細步驟: 準備工作 確保項目已配置 source maps(Vue CLI 創建的項目默認已配置&#xff0…

Zabbix 企業級分布式監控

目錄 簡介 一、監控系統基礎 1.1 監控的價值 1.2 監控的 5 大類型與 5 大層次 1.3 監控系統的實現原理 二、Zabbix:企業級監控方案 2.1 Zabbix 簡介 2.2 Zabbix 核心功能特性 2.3 Zabbix 角色與架構 三、Zabbix 部署案例 3.1 資源清單 3.2 基礎環境配置…

SQL JOIN 全解析:用 `users` 與 `orders` 表徹底掌握內連接、左連接、右連接

SQL JOIN 全解析:用 users 與 orders 表徹底掌握內連接、左連接、右連接 在日常開發中,SQL 的連接(JOIN)語句是數據庫查詢的核心技能。尤其在多表聯合查詢時,不掌握好 INNER JOIN、LEFT JOIN、RIGHT JOIN,…

(一)從零搭建unity3d機械臂仿真-unity3d導入urdf模型

1.新建工程并加載模型 (1)unity中新建3d工程 (2)將機器人模型導入到unity3d中 導入開源Unity-Robotics-Hub的機械臂。 詳細操作參考視頻 ROS Unity URDF Import Testing Robot Motion 使用 URDF Importer工具 在 Unity 中&#x…

Linux之網絡部分-應用層自定義協議與序列化

一、應用層 1.1、理解協議 協議是一種 "約定". socket api 的接口, 在讀寫數據時, 都是按 "字符串" 的方式來發送接收的。如果我們要傳輸一些 "結構化的數據" 怎么辦呢? 其實,協議就是雙方約定好的結構化的數據。 1.2、網絡版計…

機器學習week3-分類、正則化

1. 邏輯回歸1.1. 線性回歸 vs 邏輯回歸對比維度線性回歸邏輯回歸任務類型回歸(預測連續值)分類(預測離散類別)輸出范圍(?∞,∞)[0,1](概率值)損失函數均方誤差(MSE)對數損失&#x…

FastAdmin 中生成插件

在 FastAdmin 中生成一個 OCR 發票識別插件,可以按照以下步驟進行開發。這里假設你已經熟悉 FastAdmin 插件開發的基本流程,并會使用 Composer 和 PHP 擴展。1. 創建插件骨架使用 FastAdmin 命令行工具生成插件基礎結構:php think addon -a o…

DevExpress WinForms中文教程:Grouping(分組)- 如何自定義分組算法?

DevExpress WinForms擁有180組件和UI庫,能為Windows Forms平臺創建具有影響力的業務解決方案。DevExpress WinForms能完美構建流暢、美觀且易于使用的應用程序,無論是Office風格的界面,還是分析處理大批量的業務數據,它都能輕松勝…

PHP 與 Vue.js 結合的前后端分離架構

PHP 與 Vue.js 結合是構建現代 Web 應用的流行技術棧,通常采用 前后端分離架構。以下是關鍵要點和推薦實現方案: 一、技術棧組合 角色技術選項后端 (PHP)Laravel (推薦)、Symfony、CodeIgniter前端 (Vue)Vue 2/3、Vue Router、Pinia/Vuex、Vite通信協議…

XML高效處理類 - 專為Office文檔XML處理優化

/**** 提供XML讀取、寫入、修改、查詢等高級功能,支持命名空間和復雜XML結構* * 主要功能:* 1. 復雜路徑解析(支持屬性篩選、索引、通配符)* 2. 完整節點類型支持(元素、文本、CDATA、注釋、PI)* 3. 高效元…