多執行緒基礎

2021-08-28 02:54:42 字數 2340 閱讀 6981

* 建立執行緒任務兩種方式

*    1.繼承thread 類 重寫run方法。此方法內容為多執行緒任務。

*    2.通過d實現runnable介面實現run方法。建立d物件 ticket d = new ticket();  更常用。

*    thread t1 = new thread();  方式一

*    thread t2 = new thread(t); 方式二  

*  1,多個執行緒在操作共享資料。

*  2,有多條語句對共享資料進行運算。

*   synchronized(物件)

*   同步函式所使用的鎖就是this鎖 當同步函式被static修飾時 用的是 (類名.class)

*   拿到鎖的執行緒才能執行**塊中的語句。

字串常量做鎖,常量是唯一的,兩個執行緒跑乙個**塊,必須是第乙個執行緒丟鎖之後,第二個執行緒才能拿到鎖。

而 new string("常量"),每次執行都是新的鎖。

wait:將同步中的執行緒處於凍結狀態。釋放了執行權,釋放了資格。同時將執行緒物件儲存到執行緒池中。

wait()  方法應該由鎖物件來呼叫,鎖是哪個物件就由誰來呼叫。同步函式用 this.wait   同步**塊用 lock.wait. 靜態同步函式中使用earlynotify.class.wait();, 因為earlynotify.class就是其鎖物件

notiry同理。

notify:喚醒執行緒池中某乙個等待執行緒。

notifyall:喚醒的是執行緒池中的所有執行緒。

wait和sleep區別: 分析這兩個方法:從執行權和鎖上來分析:

wait:可以指定時間也可以不指定時間。不指定時間,只能由對應的notify或者notifyall來喚醒。

sleep:必須指定時間,時間到自動從凍結狀態轉成執行狀態(臨時阻塞狀態)。

wait:執行緒會釋放執行權,而且執行緒會釋放鎖,並且需要喚醒。

sleep:執行緒會釋放執行權,但是不釋放鎖。

yield() :執行緒會釋放執行權,而且執行緒會釋放鎖,使用

yield()

的目的是讓具有相同優先順序的執行緒之間能夠適當的輪換執行。

// 延遲 執行該執行緒。 放棄當前的執行權和鎖, 進入就緒佇列。分到cpu後會再次嘗試獲得鎖,並執行

while (thread.activecount()>2)

釋放執行權:即將cpu讓給其他執行緒,但仍擁有鎖,同步中的其他執行緒仍不能執行。。

釋放鎖是針對同步而言,將鎖給另乙個執行緒允許其執行同步中的內容。

因而,wait丟失執行權,允許同步中的其他執行緒執行。

而  , sleep不允許同步中的其他執行緒執行,但是其他同步中的執行緒可以執行。

對於同乙個同步塊,多個執行緒進行排隊,進行鎖的競爭。

對於同乙個同步方法,呼叫物件不同,則鎖不同,不是同乙個同步。(隱式引數不同)

對於兩個同步方法,呼叫物件相同,執行緒不同,也是同乙個鎖,在乙個同步內。

鎖是否相同關鍵是直接呼叫同步塊方法的物件是否相同。同乙個物件的多個同步方法共享一把鎖

若該方法式static,即隱式引數相同,則鎖為類物件,多個物件呼叫時是同一把鎖,在乙個同步內。

1. 通過迴圈中斷

2.interrupt():中斷執行緒。

在阻塞狀態下呼叫interrupt 將會丟擲 interruptedexception異常,並且中斷無效。

中斷情況下不能呼叫sleep ,sleep不能中斷,中斷必須在進行時。中斷時呼叫sleep會清除中斷,並丟擲中斷異常。

setpriority(int newpriority):更改執行緒的優先順序。

getpriority():返回執行緒的優先順序。

tostring():返回該執行緒的字串表示形式,包括執行緒名稱、優先順序和執行緒組。

thread thread = new thread()  

thread.setdaemon(true);

thread.start();

多執行緒基礎

對於多執行緒程式設計,很多人概念不清,寫 的時候要麼是處處加鎖,影響效能不說,還容易莫名其妙的死鎖,還有人對多執行緒敬而遠之。所以學習多執行緒程式設計最重要的不是學習 api,而是理解什麼才是多執行緒安全的 從例子說起 include include long global1 0 volatile ...

多執行緒基礎

什麼是併發 同時執行多個程式,或者乙個程式的多段 在巨集觀上,存在併發的,但是在微觀上,其實不存在併發 時間片 在計算機中,使用時間片來實現併發的運算 在計算甲中,在最小的單位時間上 只能執行乙個運算 用來控制多個程式之間的輪轉,使得程式交替的執行 達到併發的目的 多個cpu 多個核心 才能實現真正...

多執行緒基礎

多執行緒的最底層依賴於unsafe的compareandswap cas 和locksupport的park和unpark操作。cas需要傳遞兩個引數 expect和update。先跟第乙個引數expect進行比較,如果等於第乙個引數,那麼就將該值設定為第二個引數,這是由硬體提供的原子操作,所以不會...