多執行緒學習筆記

2022-09-22 06:48:09 字數 4268 閱讀 8739

在單個程式中同時執行多個執行緒完成不同的工作,稱為多執行緒(提公升整體處理效能)

執行緒是程式的最小單位,相對獨立的可呼叫單元,是 cpu 最小基本單位;

在同乙個程式中不同的執行緒完成功能,稱為多執行緒。(軟體中最小單位就是執行緒)

程式程序

執行緒程式就是一段靜態的**,是應用程式的藍本

程序是正在執行的程式的例項:程序是程式的一次正常執行,從**載入到最後一句**的執行,整個過程就是程序的生命週期

程序中獨立、可呼叫的最小執行單元:執行緒是程式中乙個單一的順序控制流程

乙個程式只有乙個主線程:j**a 應用程式中主線程就是main方法,其他的都是子執行緒

建立乙個類繼承 thread 類(多個執行緒分別完成自己的任務)

thread th = new thread();

th.start();

建立乙個類實現乙個 runnable (多個執行緒共同完成同乙個任務)

thread th = new thread(new runnable());

th.start();

使用 runnable 介面建立的執行緒,還是要借用 thread 類來啟動執行緒

執行緒是非同步的,可以同時操作多個任務建立:執行緒的構造

啟動:執行緒物件呼叫start()方法

執行:占用cpu,進入run()方法

中斷:在run()方法中,遇到sleep()wait()方法,執行緒就會中斷,讓出cpu資源

死亡:執行完run()方法

新建狀態(new):建立了乙個執行緒物件,但是沒有啟動

就緒狀態(runnable):執行緒物件呼叫了start()方法

執行狀態(runnable):執行緒物件占用cpu,進入run()方法

阻塞狀態(blocked):執行緒物件放棄cpu,暫停執行,遇到sleep()方法

死亡狀態(terminated):執行緒執行完run()方法

當乙個執行緒物件在 sleep 的時候,可以用過interrupt()方法強制喚醒,喚醒後會丟擲j**a.lang.interruptedexception

方法描述

start()

啟動執行緒(使執行緒處於就緒狀態)

run()

執行緒占用cpu正在執行,業務邏輯寫在此方法中

setname()

給執行緒設定名稱

getname()

獲取執行緒名稱

setpriority()

設定執行緒的優先級別:1為最小、5為預設、10為最大

getpriority()

獲取執行緒的優先順序

currentthread()

獲取當前正在執行的執行緒

getstate()

獲取執行緒狀態

sleep()

執行緒的休眠

interrupt()

執行緒中斷休眠

isinterrupted()

判斷執行緒是否為中斷狀態

isalive()

測試執行緒是否處於活動狀態

setdaemon()

把執行緒設定為守護執行緒(當程式中其他守護執行緒結束時,該守護執行緒也會結束)

isdaemon()

判斷執行緒是否為守護執行緒

join()

等待該執行緒終止

yield()

暫停當前正在執行的執行緒,並執行其他執行緒(包含了自己本身)

什麼是執行緒不安全?

多個執行緒改變同乙個物件的同乙個全域性屬性,就會造成執行緒不安全

執行緒不安全有三個必要條件?

必須是同乙個物件

必須改變同乙個全域性屬性

必須是多個執行緒操作

同步鎖在方法行增加 synchronized 關鍵字,增加同步關鍵字之後,方法呼叫變緩慢,變成重量級

同步方法(方法鎖):在方法上面加 synchronized 關鍵字

同步**塊(物件鎖):鎖相對應的物件

類鎖:synchronized(student.class){}

可重入鎖(reentrantlock):鎖具體的**塊

wait():執行緒掛起

notify():喚醒單個執行緒

notifyall():喚醒所有執行緒

wait()方法不穩定必須要加上同步鎖

以上三個方法全是 object 類的方法

懶漢模式

構造私有化

宣告乙個靜態的自身物件屬性

提供靜態方法,返回自身物件,方法必須加上synchronized關鍵字

惡漢模式

構造私有化

宣告乙個靜態自身屬性,並且例項化

提供乙個靜態方法返回自身物件

作用優點

缺點始終保持乙個例項

節約記憶體空間,建立效率高

容易造成執行緒不安全問題

列舉是 j**a 中一種資料型別,相當於常量,但比常量的擴充套件性強

列舉型別存放在 jvm 的常量池中,永遠不會被**,除非程式關閉

列舉預設是單例,所以構造方法必須私有化

宣告列舉的時候,必須固定好例項,列舉的例項必須事先宣告

定義:
public enum 列舉名稱{}
動態方法上的 synchronized 鎖,鎖的是當前物件

靜態方法上的 synchronized 鎖,鎖的是當前類的位元組碼

動態方法與靜態方法進行同步鎖,那麼鎖同乙個全域性變數

同步方法中呼叫了wait()方法,會讓出 cpu 並且釋放鎖,呼叫sleep()方法,只會讓出 cpu 不會釋放鎖

同步鎖必須鎖同一樣東西才會生效

sleep 是 thread 類中的方法,wait 方法是 object 類的方法

sleep 方法只會讓出 cpu,不會釋放鎖

wait 方法會讓出 cpu 並且釋放鎖

使用 sleep 方法不需要結合同步鎖,wait 方法一定要結合同步鎖使用

sleep 方法會根據引數設定的時間自然醒,wait 方法除了會根據引數設定的時間自然醒,還可以通過notify()notifyall()喚醒

timer:定時器

timertask:定時器任務

synchronized 關鍵字修飾的方法

synchronized 關鍵字修飾的語句塊

volatile 關鍵字修飾的變數,多個變數訪問時,可以保證最新值

jdk 在j**a.util.concurrent包下提供了一把鎖的機制,**如下:

// 可以放在任何地方進行同步鎖

lock lock = new reentrantlock();

// 加鎖

lock.lock()

// 解鎖

lock.unlock()

使用 threadlocal 管理全域性變數,可以使單例物件多例屬性,也稱為:執行緒變數。

threadlocal通過set方法進行賦值,get方法取值

使用佇列阻塞

使用原子變數實現執行緒同步

執行緒安全

執行緒不安全

stringbuffer

stringbuilder

vector

arraylist

hashtable

hashmap

做乙個簡單的快取機制,快取中儲存部分表的資料,使用資料時從記憶體中獲取,不去查資料庫

程式執行main方法時,把指定表的資料讀取出來,存放到單例模式中的資料結構中(map)

查詢資料時,直接從單例模式中獲取表中的資料

每隔半小時,同步一次資料庫與記憶體中的資料

什麼樣的資料適合放在快取機制中?

經常被查詢的資料

不會經常改變的資料,更新的頻率不頻繁

多執行緒學習筆記 執行緒

thread類 常用屬性 currentthread 獲取當前正在執行的執行緒 isalive 指示當前執行緒的執行狀態 isbackground 指示是否為後台執行緒 isthreadpoolthread 指示是否屬於託管執行緒池 managedthreadid 獲取執行緒識別符號 name 獲取...

多執行緒學習筆記

多執行緒的相關概念 什麼是程序?當乙個程式開始執行時,它就是乙個程序,程序包括執行中的程式和程式所使用到的記憶體和系統資源。而乙個程序又是由多個執行緒所組成的。什麼是執行緒?執行緒是程式中的乙個執行流,每個執行緒都有自己的專有暫存器 棧指標 程式計數器等 但 區是共享的,即不同的執行緒可以執行同樣的...

多執行緒學習筆記

多執行緒是實現多工的一種方式,多個程序多個執行緒。建立執行緒 1.繼承thread類 子類覆蓋父類中的run方法,將執行緒執行的 存放在run中。2.建立子類物件的同時執行緒也被建立。3.通過呼叫start方法開啟執行緒。執行緒的各種狀態 1.建立狀態 在程式中用構造方法建立了乙個執行緒物件後,新的...