014_多線程

多線程

  • 多線程
  • 創建線程
    • 方式一:繼承Thread類
    • 方式二:實現Runable接口
    • 方式三:實現Callbale接口
  • Thread的常用方法
  • 線程安全
  • 線程同步
    • 方式一:同步代碼塊
    • 同步方法
    • 方式三:Lock鎖
  • 線性池
    • 創建線程池
    • 處理Runnable任務
    • 處理Callable任務
    • 通過Executors創建線程池
  • 并發/并行
    • 并發
    • 并行

多線程

  • 線程(Thread)是一個程序內部的一條執行流程。
  • 程序中如果只有一條執行流程,那這個程序就是單線程的程序。
  • 多線程是指從軟硬件上實現的多條執行流程的技術(多條線程由CPU負責調度執行)。

創建線程

  • 啟動線程必須是調用start方法,不是調用run方法。
    • 直接調用run方法會當成普通方法執行,此時相當于還是單線程執行
    • 只有調用start方法才是啟動一個新的線程執行。
  • 不要把主線程任務放在啟動子線程之前。
    • 這樣主線程一直是先跑完的,相當于是一個單線程的效果了。

方式一:繼承Thread類

  • 定義一個子類MyThread繼承線程類java.lang.Thread,重寫run()方法
  • 創建MyThread類的對象
  • 調用線程對象的start()方法啟動線程(啟動后還是執行run方法的)
  • 優缺點
    • 優點:編碼簡單
    • 缺點:線程類已經繼承Thread,無法繼承其他類,不利于功能的擴展。

方式二:實現Runable接口

  • 定義一個線程任務類MyRunnable實現Runnable接口,重寫run()方法
  • 創建MyRunnable任務對象
  • 把MyRunnable任務對象交給Thread處理。
  • 調用線程對象的start()方法啟動線程
  • 優缺點
    • 優點:任務類只是實現接口,可以繼續繼承其他類、實現其他接口,擴展性強。
    • 缺點:需要多一個Runnable對象。
Thread****類提供的構造器說明
public Thread(Runnable target)封裝Runnable對象成為線程對象
  • 匿名內部類寫法
    • 可以創建Runnable的匿名內部類對象。
    • 再交給Thread線程對象。
    • 再調用線程對象的start()啟動線程。

方式三:實現Callbale接口

  • 創建任務對象
    • 定義一個類實現Callable接口,重寫call方法,封裝要做的事情,和要返回的數據。
    • 把Callable類型的對象封裝成FutureTask(線程任務對象)。
  • 把線程任務對象交給Thread對象。
  • 調用Thread對象的start方法啟動線程。
  • 線程執行完畢后、通過FutureTask對象的的get方法去獲取線程任務執行的結果。
  • 優缺點
    • 優點:線程任務類只是實現接口,可以繼續繼承類和實現接口,擴展性強;可以在線程執行完畢后去獲取線程執行的結果。
    • 缺點:編碼復雜一點。
  • FutureTask的API
FutureTask提供的構造器說明
public FutureTask<>(Callable call)把Callable對象封裝成FutureTask對象。
FutureTask提供的方法說明
public V get() throws Exception獲取線程執行call方法返回的結果。

Thread的常用方法

Thread提供的常用方法說明
public void run()線程的任務方法
public void start()啟動線程
public String getName()獲取當前線程的名稱,線程名稱默認是Thread-索引
public void setName (String name)為線程設置名稱
public static Thread currentThread ()獲取當前執行的線程對象
public static void sleep(long time)讓當前執行的線程休眠多少毫秒后,再繼續執行
public final void join()…讓調用當前這個方法的線程先執行完!
Thread 提供的常見構造器說明
public Thread(String name)可以為當前線程指定名稱
public Thread(Runnable target)封裝Runnable對象成為線程對象
public Thread(Runnable target, String name)封裝Runnable對象成為線程對象,并指定線程名稱

線程安全

  • 多個線程,同時操作同一個共享資源的時候,可能會出現業務安全問題。
    • 存在多個線程在同時執行
    • 同時訪問一個共享資源
    • 存在修改該共享資源

線程同步

  • 線程同步是線程安全問題的解決方案。
  • 線程同步的核心思想
    • 讓多個線程先后依次訪問共享資源,這樣就可以避免出現線程安全問題。
  • 線程同步的常見方案
    • 加鎖:每次只允許一個線程加鎖,加鎖后才能進入訪問,訪問完畢后自動解鎖,然后其他線程才能再加鎖進來。

方式一:同步代碼塊

  • 作用:把訪問共享資源的核心代碼給上鎖,以此保證線程安全。
    • 對出現問題的核心代碼使用synchronized進行加鎖
    • 每次只能一個線程占鎖進入訪問
  • 原理:每次只允許一個線程加鎖后進入,執行完畢后自動解鎖,其他線程才可以進來執行。
  • 對于當前同時執行的線程來說,同步鎖必須是同一把(同一個對象),否則會出bug。
  • 鎖對象的使用規范
    • 建議使用共享資源作為鎖對象,對于實例方法建議使用this作為鎖對象。
    • 對于靜態方法建議使用字節碼(類名.class)對象作為鎖對象。
synchronized(同步鎖) {訪問共享資源的核心代碼
}

同步方法

  • 作用:把訪問共享資源的核心方法給上鎖,以此保證線程安全。

  • 原理:每次只能一個線程進入,執行完畢以后自動解鎖,其他線程才可以進來執行。

  • 同步方法其實底層也是有隱式鎖對象的,只是鎖的范圍是整個方法代碼。

  • 如果方法是實例方法:同步方法默認用this作為的鎖對象。

  • 如果方法是靜態方法:同步方法默認用類名.class作為的鎖對象。

修飾符 synchronized 返回值類型 方法名稱(形參列表) {操作共享資源的代碼
}

方式三:Lock鎖

  • Lock鎖是JDK5開始提供的一個新的鎖定操作,通過它可以創建出鎖對象進行加鎖和解鎖,更靈活、更方便、更強大。
  • Lock是接口,不能直接實例化,可以采用它的實現類ReentrantLock來構建Lock鎖對象。
  • 鎖對象建議使用final修飾,防止被別人篡改
  • 釋放鎖建議將釋放鎖的操作放到finally代碼塊中,確保鎖用完了一定會被釋放

線性池

  • 線程池就是一個可以復用線程的技術。
  • 不使用線性池的問題
    • 用戶每發起一個請求,后臺就需要創建一個新線程來處理,下次新任務來了肯定又要創建新線程處理的, 創建新線程的開銷是很大的,并且請求過多時,肯定會產生大量的線程出來,這樣會嚴重影響系統的性能。
  • 線程池的工作原理
    線程池的基本概念是,在應用程序啟動時創建一定數量的線程,并將它們保存在線程池中。當需要執行任務時,從線程池中獲取一個空閑的線程,將任務分配給該線程執行。當任務執行完畢后,線程將返回到線程池,可以被其他任務復用。
    • 線程池:{有限的任務隊列(WorkQueue)}
    • 工作線程WorkThread進行選擇任務隊列的對象。
    • 任務接口
      • Runable
      • Callable

創建線程池

  • JDK 5.0起提供了代表線程池的接口:ExecutorService。
  • 方式一:使用ExecutorService的實現類ThreadPoolExecutor自創建一個線程池對象。
    ExecutorService ——> ThreadPoolExecutor
    • 通過ThreadPoolExecutor創建線程池。
      • 參數一:corePoolSize : 指定線程池的核心線程的數量。
      • 參數二:maximumPoolSize:指定線程池的最大線程數量。
      • 參數三:keepAliveTime :指定臨時線程的存活時間。
      • 參數四:unit:指定臨時線程存活的時間單位(秒、分、時、天)
      • 參數五:workQueue:指定線程池的任務隊列。
      • 參數六:threadFactory:指定線程池的線程工廠。
      • 參數七:handler:指定線程池的任務拒絕策略(線程都在忙,任務隊列也滿了的時候,新任務來了該怎么處理)
ThreadPoolExecutor類提供的構造器作用
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)使用指定的初始化參數創建一個新的線程池對象
  • 方式二:使用Executors(線程池的工具類)調用方法返回不同特點的線程池對象。

處理Runnable任務

  • ExecutorService的常用方法
方法名稱說明
void execute(Runnable command)執行 Runnable 任務
Future submit(Callable task)執行 Callable 任務,返回未來任務對象,用于獲取線程返回的結果
void shutdown()等全部任務執行完畢后,再關閉線程池!
List shutdownNow()立刻關閉線程池,停止正在執行的任務,并返回隊列中未執行的任務
  • 線程池的注意事項
    • 新任務提交時發現核心線程都在忙,任務隊列也滿了,并且還可以創建臨時線程,此時才會創建臨時線程。
      什么時候會拒絕新任務?
    • 核心線程和臨時線程都在忙,任務隊列也滿了,新的任務過來的時候才會開始拒絕任務。
  • 任務拒絕策略
策略說明
ThreadPoolExecutor.AbortPolicy()丟棄任務并拋出RejectedExecutionException異常。是默認的策略
ThreadPoolExecutor. DiscardPolicy()丟棄任務,但是不拋出異常,這是不推薦的做法
ThreadPoolExecutor. DiscardOldestPolicy()拋棄隊列中等待最久的任務 然后把當前任務加入隊列中
ThreadPoolExecutor. CallerRunsPolicy()由主線程負責調用任務的run()方法從而繞過線程池直接執行

處理Callable任務

  • 線程池使用ExecutorService的方法處理Callable任務,并得到任務執行完后返回的結果。
    Future<T> submit(Callable<T> command)

通過Executors創建線程池

  • Executors是一個線程池的工具類,提供了很多靜態方法用于返回不同特點的線程池對象。
  • 方法的底層,都是通過線程池的實現類ThreadPoolExecutor創建的線程池對象。
方法名稱說明
public static ExecutorService newFixedThreadPool(int nThreads)創建固定線程數量的線程池,如果某個線程因為執行異常而結束,那么線程池會補充一個新線程替代它。
public static ExecutorService newSingleThreadExecutor()創建只有一個線程的線程池對象,如果該線程出現異常而結束,那么線程池會補充一個新線程。
public static ExecutorService newCachedThreadPool()線程數量隨著任務增加而增加,如果線程任務執行完畢且空閑了60s則會被回收掉。
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)創建一個線程池,可以實現在給定的延遲后運行任務,或者定期執行任務。
  • Executors不是適合做大型互聯網場景的線程池方案。
    • 建議使用ThreadPoolExecutor來指定線程池參數,這樣可以明確線程池的運行規則,規避資源耗盡的風險。

并發/并行

  • 正在運行的程序(軟件)就是一個獨立的進程。
  • 線程是屬于進程的,一個進程中可以同時運行很多個線程。
  • 進程中的多個線程其實是并發和并行執行的。

并發

  • 進程中的線程是由CPU負責調度執行的,但CPU能同時處理線程的數量有限,為了保證全部線程都能往前執行,CPU會輪詢為系統的每個線程服務,由于CPU切換的速度很快,給我們的感覺這些線程在同時執行,這就是并發。

并行

  • 在同一個時刻上,同時有多個線程在被CPU調度執行。

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

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

相關文章

機場跑道異物檢測數據集VOC+YOLO格式33793張31類別

數據集分辨率都是300x300,都是貼近地面拍攝&#xff0c;具體看圖片 據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數)&#xff1a;33793 標注數量(xml文件…

Spring Cloud 遠程調用

4.OpenFeign的實現原理是什么&#xff1f; 在使用OpenFeign的時候&#xff0c;主要關心兩個注解&#xff0c;EnableFeignClients和FeignClient。整體的流程分為以下幾個部分&#xff1a; 啟用Feign代理&#xff0c;通過在啟動類上添加EnableFeignClients注解&#xff0c;開啟F…

Unity中使用FMETP STREAM傳輸實時畫面

一、客戶端&#xff08;發送端&#xff09; 總體思路&#xff1a;先把畫面編碼Encoder&#xff0c;再發送給服務端 新建場景&#xff0c;創建一個實體&#xff0c;名為FMnet&#xff0c;添加組件FMNetworkManager&#xff0c;將NetworkType設置為客戶端Client&#xff0c;設置…

Baklib三步構建企業內容中臺

需求調研構建內容中臺 企業內容中臺建設的首要環節在于精準識別業務需求與知識管理痛點。通過Baklib 是什么類型的工具的定位分析可知&#xff0c;其作為知識管理中樞&#xff0c;能夠系統梳理客戶服務場景中的高頻咨詢、產品文檔更新需求及跨部門協作流程。在需求調研階段&am…

實現抗隱私泄漏的AI人工智能推理

目錄 什么是私人AI? 什么是可信執行環境? TEE 如何在 AI 推理期間保護數據? 使用 TEE 是否存在風險? 有哪些風險? Atoma 如何應對這些風險 為什么去中心化網絡是解決方案 人工智能推理過程中還有其他保護隱私的方法嗎? 私人人工智能可以實現什么? 隱私驅動的應…

一、TorchRec里邊的輸入輸出類型

TorchRec中的輸入和輸出格式 文章目錄 TorchRec中的輸入和輸出格式前言一、JaggedTensor1.1 核心概念1.2 核心屬性&#xff0c;也就是參數1.3 關鍵操作與方法 二、KeyedJaggedTensor2.1 核心概念2.2 核心屬性&#xff0c;也就是參數 3、KeyedTensor總結 前言 TorchRec具有其特…

JAVA實現在H5頁面中點擊鏈接直接進入微信小程序

在普通的Html5頁面中如何實現點擊URL鏈接直接進入微信小程序&#xff0c;不需要掃描小程序二維碼&#xff1f; 網上介紹的很多方法是在小程序后臺設置Schema&#xff0c;不過我進入我的小程序后臺在開發設置里面 沒有找到設置小程序Schema的地方&#xff0c;我是通過調用API接口…

uniapp解決上架華為應用市場審核要求-監聽權限的申請

支持android平臺全局監聽權限的申請。當申請權限時&#xff0c;會在頁面頂部顯示申請權限的目的。主要解決上架華為應用市場審核要求&#xff1a;APP在調用終端權限時&#xff0c;應同步告知用戶申請該權限的目的。 因為如果不提示&#xff0c;你上架應用市場會被打打回來 Tip…

文件IO5(JPEG圖像原理與應用)

JPEG圖像原理與應用 ? 基本概念 JPEG&#xff08;Joint Photographic Experts Group&#xff09;指的是聯合圖像專家組&#xff0c;是國際標準化組織ISO制訂并于1992年發布的一種面向連續色調靜止圖像的壓縮編碼標準&#xff0c;所以也被稱為JPEG標準。 同樣&#xff0c;JP…

vue3 history路由模式刷新頁面報錯問題解決

在使用history路由模式時刷新網頁提示404錯誤&#xff0c;這是改怎么辦呢。 官方解決辦法 https://router.vuejs.org/zh/guide/essentials/history-mode.html

3D激光輪廓儀知識整理(待完善)

文章目錄 1.原理和應用場景1.1 相機原理1.1.1 測量原理1.1.2 相機激光器1.1.3 沙姆鏡頭1.1.4 相機標定1.1.5 中心線提取 1.2 應用場景1.2.1 測量相關應用1.2.2 缺陷檢測相關應用 2.相機參數介紹及選型介紹2.1 成像原理2.2 原始圖成像2.3 生成輪廓圖2.4 相機規格參數2.4.1 單輪廓…

w285藥店管理系統的設計與實現

&#x1f64a;作者簡介&#xff1a;多年一線開發工作經驗&#xff0c;原創團隊&#xff0c;分享技術代碼幫助學生學習&#xff0c;獨立完成自己的網站項目。 代碼可以查看文章末尾??聯系方式獲取&#xff0c;記得注明來意哦~&#x1f339;贈送計算機畢業設計600個選題excel文…

Google Chrome Canary版官方下載及安裝教程【適用于開發者與進階用戶】

谷歌瀏覽器&#xff08;Google Chrome&#xff09;以其高性能、強擴展性和良好的用戶體驗深受全球用戶喜愛。在其多個版本中&#xff0c;Chrome Canary因具備最前沿的功能測試環境&#xff0c;成為開發者和技術探索者的首選。如果你希望第一時間體驗Google Chrome最新功能&…

RocketMQ深度百科全書式解析

?一、核心架構與設計哲學? ?1. 設計目標? ?海量消息堆積?&#xff1a;單機支持百萬級消息堆積&#xff0c;適合大數據場景&#xff08;如日志采集&#xff09;。?嚴格順序性?&#xff1a;通過隊列分區&#xff08;Queue&#xff09;和消費鎖機制保證局部順序。?事務…

每日一題(小白)暴力娛樂篇19

樣例&#xff1a; 6 1 1 4 5 1 4 輸出&#xff1a; 56 66 52 44 54 64 分析題意可以得知&#xff0c;就是接收一串數字&#xff0c;將數字按照下標每次向右移動一位&#xff08;末尾循環到第一位&#xff09;&#xff0c;每次移動玩計算一下下標和數字的乘積且累加。 ①接收…

如何應對“最后時刻任務堆積”(鼓包現象)

應對“最后時刻任務堆積”&#xff08;鼓包現象&#xff09;的方法包括&#xff1a;合理規劃項目時間表、強化進度跟蹤管理、明確任務優先級、有效的資源配置、提升團隊溝通效率。其中&#xff0c;強化進度跟蹤管理尤為關鍵。根據項目管理協會&#xff08;PMI&#xff09;的調查…

19C-19.3環境-impdp導入到view時卡死

幫客戶導入一個用戶時&#xff0c;發現VIEW部分無法進行下去 Processing object type SCHEMA_EXPORT/TABLE/IDENTITY_COLUMN Processing object type SCHEMA_EXPORT/PACKAGE/PACKAGE_SPEC Processing object type SCHEMA_EXPORT/FUNCTION/FUNCTION Processing object type SCH…

一、簡單的 Django 服務

一、配置虛擬環境 1.1 創建一個文件夾在導航欄輸入cmd打開 1.2 安裝依賴兩個庫 pip install virtualenv virtualenvwrapper-win -i https://pypi.tuna.tsinghua.edu.cn/simple驗證是否安裝成功 virtualenv --version pip show virtualenvwrapper-win 1.3 創建虛擬環境 mkvi…

道路運輸安全員崗位事項有哪些?

道路運輸安全員的崗位事項主要包括以下幾個方面&#xff1a; 安全制度與計劃 參與制定和完善道路運輸企業的安全管理制度、安全操作規程等&#xff0c;確保各項安全工作有章可循。協助制定年度安全工作計劃和目標&#xff0c;并負責組織實施和監督執行情況&#xff0c;定期對…

瀟灑浪: Dify 上傳自定義文件去除內容校驗 File validation failed for file: re.json

Dify上傳文件 添加其他文件類型如 my.myselfsuffix 上傳成功 執行報錯 File validation failed for file: re.json 解決辦法 Notepad 搜索dify源碼 注釋掉&#xff0c;重啟容器 或者直接在容器中修改重啟