JavaEE-初階-多線程初階

概念

?

?

第一個多線程程序?

可以通過查看jdk路徑來找到jdk的控制

可以通過jconsole來查看線程。

創建線程

這是實現多線程的其中一種方法,繼承Thread類,實現run方法,之后實例化繼承了Thread類的MyThread方法,調用start方法,就會自動創建一個線程去執行run方法,如果直接調用run方法是不會創建新的線程的。

實現Runnable接口,也要實現run方法,但是和繼承Thread類的不同,耦合度較低,在實例化Thread時將實例化繼承了Runnable接口的對象傳遞,start執行的就是這個run方法

其他變形

多線程的優勢-增加運行速度

Thread類以及常見方法

Thread的常見構造方法

Thread的常見屬性

比較重要的就是判斷后臺線程和判斷是否存活的方法。前臺線程可以決定進程是否結束,只要還有一個前臺線程運行,進程就不會終止,后臺線程就算在運行,只要前臺線程都結束了,進程還是要結束。

啟動?個線程 - start()

終止線程

?

可以自定義一個變量,約定好在這個變量修改為約定值時,就終止線程。

Thread對象調用,該對象對應的線程終止。

在一些情況下,有要求,線程要有結束的先后順序,那么就可以通過線程的對象,來等待線程,來做到線程的結束順序變為可控。

獲取當前線程引用

這是一個靜態方法,可以直接通過類來調用,返回的時當前調用該方法的類對象的引用。

休眠線程

線程的狀態

觀察線程的所有狀態

Waiting是

線程狀態和轉移的意義

?

多線程帶來的的風險-線程安全 (重點)

觀察線程不安全

線程安全的概念

線程不安全的原因

可見性

指令重排序

解決之前的線程不安全問題

synchronized 關鍵字 - 監視器鎖 monitor lock

synchronized 的特性

不可重入的鎖在加了一個鎖之后,再次加同一把鎖就會出現死鎖,這種鎖就是不可重入鎖

而可重入鎖在再次上鎖的時候發現這個鎖是自身持有的鎖,那么就不會再加鎖,而鎖的釋放時根據第一次上該鎖的作用域來確定的。

synchronized 使用示例

這個鎖可以是任意的對象,一個對象就可以視為是一個鎖。

鎖this對象和直接修飾普通方法是一樣的。

死鎖

Java 標準庫中的線程安全類

volatile 關鍵字

volatile關鍵字可以將一些因為java優化所導致的可見性問題解決。

?

工作內存或寄存器和主內存

因為并不是所有的cpu都是直接優化在寄存器上的,所以直接說優化都是將數據存儲在寄存器上方便讀取不太合適,還有多級別的緩存,所以work memory更加合適。

wait 和 notify

wait()方法

notify()方法

notifyAll()方法

notifyAll雖然一次性喚醒了所有鎖,但是這些鎖還是需要重新競爭的。

wait和sleep的區別

多線程案例

單例模式

餓漢模式

懶漢模式(單線程)

懶漢模式-多線程版

懶漢模式-多線程版-改進

可能因為指令重排序導致還沒有申請內存空間就將值賦給了instance,導致其他線程直接帶著這個沒有初始化的變量返回了。

解決方法實際上還是volatile

阻塞隊列

一個線程給阻塞隊列添加數據,一個線程消費數據。

生產數據,阻塞隊列滿了,就會阻塞,消費數據,阻塞隊列為空就會阻塞。

這個判斷語句最好選擇while,本質上是為了二次驗證數據是否滿足要求,因為wait不僅僅能夠被notify喚醒,也可能是設置的時間到了被喚醒,這種情況就需要對參數進行再次校驗。

線程池

創建線程池的方法

參數代表的含義

工廠模式

工廠模式也是一種設計模式,主要應用再構造方法中,構造方法同名同參無法構成重載,因為構造方法要求是方法名與類名等同,而另外定義一個工廠類,提供構造對象的方法,就可以實現這些功能,而且可以根據不同的構造方法提供不同的參數。

因為原本的構造方法有些復雜

自主實現一個簡易的線程池

定時器

第一個參數也就是實現了run方法的runnable接口的子類。

實現一個簡易定時器

首先創建一個保存了執行方法和執行時間的類,并且要實現compareTo,因為需要加到優先級隊列里面。

第二部要創建一個定時器類。

schedule傳遞的參數是一個runnable類和一個時間,代表多久之后執行方法,實例化一個保存了執行時間和方法的類對象。保存的時間是時間戳,獲取系統當前時間并將多久之后執行加上,加入優先級隊列,喚醒在locker鎖之中阻塞的一個線程,讓線程去執行任務。

這里需要注意的是鎖的范圍,這里將新創建的MyTimeTask對象也包括進去了,是否需要包括進去,看的是需求,如果算調用方法開始算時間就在鎖外面,如果是鎖里面開始算時間就包括在鎖里面。

構造方法開始就要循環判斷是否有任務需要執行。

但是之前的方法有缺陷,會導致cpu資源被占用嚴重,所以在判斷到隊列為空和時間未到都會開始阻塞,而時間未到的阻塞還會另外設定一個時間,這個時間就是距離實際執行方法時間的差值,盡管線程被喚醒可能還是沒有到執行時間,因為是優先級隊列,喚醒的是最早執行的,那么也不過是再進去while循環做一次時間和隊列為空判斷,對于長時間循環而言,這些消耗微不足道。

這里并不適合使用sleep

保證線程安全的思路

進程和線程

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

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

相關文章

解釋全連接層的“參數數量”和“計算過程”,保證像看動畫片一樣直觀~

假設場景輸入圖像:一張極小的 灰度圖(即 H2,W2,共4個像素),像素值如圖所示:隱藏層:假設隱藏層也是 (即 H2,W2,共4個神經元),每個神經元用 ( 表示…

DOM編程實例(不重要,可忽略)

文章目錄 簡介 表格增加刪除&#xff0c;效果如下圖 樣式屬性案例 簡介 DOM---表格添加刪除&#xff0c;樣式屬性案例 表格增加刪除&#xff0c;效果如下圖 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><met…

?Windows API 介紹及核心函數分類表

Windows API 介紹? Windows API&#xff08;Application Programming Interface&#xff09;&#xff0c;也稱為WinAPI&#xff0c;是微軟Windows操作系統的核心編程接口。它提供了一系列函數、消息、數據結構、宏和系統服務&#xff0c;允許開發者創建運行在Windows平臺上的應…

Kubernetes Dashboard UI 部署安裝

K8S 集群環境&#xff1a; Ubuntu 24 / K8S 1.28.21. 推薦使用helm 安裝Kubernetes Dashboardsudo snap install helm --classic2. 部署Kubernetes Dashboard# Add kubernetes-dashboard repository helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboar…

python-enumrate函數

文章目錄基本語法基本用法基本遍歷指定起始索引實際應用場景需要索引的循環創建字典映射處理文件行號與range(len())對比注意事項enumerate()是Python內置函數&#xff0c;用于在遍歷序列&#xff08;如列表、元組或字符串&#xff09;時同時獲取索引和值。基本語法 enumerate…

FPGA通信設計十問

1. FFT有什么用&#xff1f;FFT&#xff08;快速傅里葉變換&#xff09;是離散傅里葉變換&#xff08;DFT&#xff09;的高效實現算法&#xff0c;它的核心作用是快速將信號從時域轉換到頻域&#xff0c;從而簡化信號分析和處理的過程。自然界的信號&#xff08;如聲音、圖像、…

代理模式——Java

代理模式 在Java中代理模式是一種設計模式&#xff0c;是通過代理類來代替原始的對象&#xff0c;可以在不改變原始對象的基礎上&#xff0c;對它進行擴展&#xff08;新增一些新功能&#xff09;。在目標方法的執行的執行前后添加一些自定義的方法。 靜態代理 步驟&#xff1a…

基于Catboost算法的茶葉數據分析及價格預測系統的設計與實現

文章目錄有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主項目介紹數據采集數據預處理數據分析與可視化大屏設計模型構建系統展示每文一語有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主 項目介紹 本研究基于京東官網…

【數據庫基礎 1】MySQL環境部署及基本操作

目錄 一、MySQL部署 1.更新軟件包列表 2.查看合適的安裝包&#xff1a; 3.安裝MySQL 4.啟動數據庫服務并設置開機自啟 5.檢測MySQL當前狀態 6.配置文件修改 二、基本操作指令 1.登陸MySQL 2.創建用戶&修改用戶密碼 3.查看版本 4.退出MySQL 5.停止MySQL 6.數據…

(C++)任務管理系統(正式版)(迭代器)(list列表基礎教程)(STL基礎知識)

源代碼&#xff1a;#include <iostream> #include <list> #include <string>using namespace std;void menu(){cout<<"\n 任務管理系統 "<<endl;cout<<"1.添加普通任務"<<endl;cout<<"2.添加緊急任務…

創建uniapp項目引入uni-id用戶體系使用beforeRegister鉤子創建默認昵稱

需求描述 基于uniCloud開發項目&#xff0c;通常會使用用戶體系&#xff0c;uni-id就是基于uniCloud的用戶體系&#xff0c;滿足常規需要的賬號密碼注冊、登錄&#xff0c;微信登錄等快捷方式&#xff0c;如果使用uni-id自帶的uni-id-pages插件&#xff0c;賬號密碼注冊的話&a…

Opencv---深度學習開發

在OpenCV中進行深度學習開發&#xff0c;主要圍繞其dnn模塊展開&#xff0c;該模塊支持加載預訓練模型、預處理輸入數據、執行推理計算以及解析輸出結果。本文講解基于OpenCV進行深度學習開發的基本流程。 一、準備工作 在開始開發前&#xff0c;需完成環境配置和資源準備&…

【C++11】右值引用詳解

文章目錄前言1. 左、右值的概念1.1 左值1.2 右值1.3 右值引用2. 右值引用的價值和使用場景2.1 左值引用的價值和缺陷2.2 右值引用的價值和使用場景2.3 小結3. 完美轉發4. 類的移動構造和移動賦值前言 在C11之前&#xff0c;面對C11之前出現的臨時對象的傳參構造&#xff0c;都…

如何用自指理解世界

自指即自我指涉&#xff0c;即自己的描述關聯到了自己&#xff0c;典型例子是“這句話是假話”這個悖論。人類對自指的研究由來已久&#xff0c;很多概念、定理都與之相關&#xff0c;由于它的巧妙性&#xff0c;很多學者對其展開了深入研究&#xff0c;并且認為自指是理解宇宙…

Next.js 實戰筆記 2.0:深入 App Router 高階特性與布局解構

Next.js 實戰筆記 2.0&#xff1a;深入 App Router 高階特性與布局解構 上一篇筆記&#xff1a; Next.js 實戰筆記 1.0&#xff1a;架構重構與 App Router 核心機制詳解 上篇筆記主要回顧了一些 Next12 到 Next15 的一些變化&#xff0c;這里繼續學習/復習一些已有或者是新的…

TCP 傳輸時 sk_buff 的 clone 和 unclone

周一有位朋友咨詢個問題&#xff0c;問題本身不重要&#xff0c;但牽扯出的細節卻是非常有趣。 Linux 內核協議棧的 skb 設計非常高效和精巧&#xff0c;多個 skb 可以指向同一塊 data&#xff0c;這就是 clone&#xff0c;當 data 不止一個 skb 指示時&#xff0c;任何一個 s…

【51單片機】51單片機學習筆記-課程簡介

00. 目錄 文章目錄00. 目錄01. 學習哪種類型的單片機02. 學習單片機方法03. 學習單片機硬件設備04. 學習單片機軟件設備05. 學完單片機能做什么06. 附錄01. 學習哪種類型的單片機 單片機的型號那么多&#xff0c;該如何選擇一款合適的進行學習呢&#xff1f;這里給讀者首推的當…

【Docker基礎】Docker端口映射(-p參數)深度解析與實踐指南

目錄 前言 1 Docker網絡基礎 1.1 Docker網絡模型概述 1.2 容器網絡隔離性 2 端口映射基礎 2.1 端口映射概念 2.2 為什么需要端口映射 3 -p參數詳解 3.1 基本語法 3.2 四種映射格式 3.2.1 完整格式 3.2.2 省略宿主機IP 3.2.3 隨機宿主機端口 3.2.4 指定協議類型 …

2、鴻蒙Harmony Next開發:ArkTS語言

目錄 什么是ArkTS&#xff1f; ArkTS的發展趨勢 ArkTS的定位及約束 ArkTS的對UI的拓展 1、UI描述 2、狀態管理&#xff1a; ArkTS語法基礎 基本知識&#xff1a;聲明 基本知識&#xff1a;類型 基本知識&#xff1a;空安全 基本知識&#xff1a;類型安全與類型推斷 …

【Elasticsearch】function_score

如果你希望在 Elasticsearch 查詢中降低某些特定 `id` 的文檔評分,可以通過 `function_score` 查詢結合 `script_score` 函數來實現。`script_score` 允許你使用自定義腳本對文檔的評分進行調整。 以下是一個示例,展示如何降低某些特定 `id` 的文檔評分: 示例場景 假設我們…