多執行緒 Thread類詳解

2022-09-20 10:12:10 字數 3805 閱讀 9898

thread類是j**a中實現多執行緒程式設計的基礎類。本節就來介紹下thread類的常用api和常見用法。

thread.activecount():這個方法用於返回當前執行緒的執行緒組中活動執行緒的數量,返回的值只是乙個估計值,因為當此方法遍歷內部資料結構時,執行緒數可能會動態更改。)。

thread.checkaccess(): 檢驗當前正在執行的執行緒是否有許可權修改thread的屬性,這個方法我們一般不自己進行呼叫,thread類的set方法在進行屬性修改時都會先呼叫這個方法。

thread.currentthread():獲取當前正在執行的執行緒。

thread.dumpstack():輸出執行緒棧,一般在debug的時候呼叫。

thread.enumerate(thread tarray):??使用場景。

thread.getallstacktraces():獲取系統中所有執行緒的執行緒棧資訊。

thread.getname():獲取執行緒的名字。

thread.getpriority():獲取執行緒的優先順序。

thread.getstacktrace():獲取堆疊資訊。

thread.getstate():獲取執行緒狀態。

thread.interrupt():使得指定執行緒中斷阻塞狀態,並將阻塞標誌位置為true。

thread.interrupted():測試當前執行緒是否被中斷。

thread.isalive():判斷執行緒是否還存活著。

thread.isdaemon():判斷執行緒是否是守護執行緒。

thread.join():在當前執行緒中加入指定執行緒,使得當前執行緒必須等待指定執行緒執行結束之後,才能結束。可以理解成執行緒插隊、等待該執行緒終止。

thread.sleep(long):強制執行緒睡眠一段時間。

thread.start():啟動乙個執行緒。

thread.setname(name):設定執行緒的名字。

thread.setpriority(priority):設定執行緒的優先順序。

thread.setdaemon(true):將指定執行緒設定為守護執行緒。

thread.yield():使得當前執行緒退讓出cpu資源,把cpu排程機會分配給同樣執行緒優先順序的執行緒。

object.wait()、object.notify()、object.notifyall():object類提供的執行緒等待和執行緒喚醒方法。

sleep是thread類中乙個靜態的本地方法,因為是本地方法,所以並沒有j**a**的實現,其實是呼叫了底層的c庫函式來實現的睡眠。

sleep方法是讓當前正在執行任務的執行緒睡眠(臨時地停止執行)指定的毫秒數,這個精度和準確性是用系統時鐘和排程器保證的。但是,執行緒並不會釋放它擁有的鎖。

注意該方法會丟擲interruptedexception中斷異常。

yield方法是thread類中乙個靜態方法,是當前執行緒對排程器的乙個暗示,表示願意讓出cpu執行器的當前使用權,但是排程器可以自由忽略這個提示。

yeild是一種在可能會過度使用乙個cpu的多個執行緒之間提公升相對進度試探性嘗試。它的使用應該結合詳細的效能分析和基準測試來進行,確保它確實有預期的效果。

很少使用這種方法。 它可能對除錯或測試有用,可能有助於根據競態條件重現錯誤。 在設計併發控制結構(例如j**a.util.concurrent.locks包中的並行控制結構)時也可能有用。

yield會放棄cpu資源,不會放棄鎖資源。

join方法是執行緒例項的方法,就是等待乙個執行緒指定毫秒數後再消亡。無引數的join方法其實就是呼叫了join(0),即永遠等待下去。不過通過原始碼我們可以看到,在while迴圈中有乙個條件判斷,即isalive()方法,意思是如果當前執行緒還活著,就會一直等待下去。

如果某個執行緒在另乙個執行緒t上呼叫t.join(),此執行緒將被掛起,直到目標執行緒t結束才恢復(即t.isalive()方法返回假)。

守護執行緒可以理解為服務執行緒,它們的作用就是服務於其他使用者執行緒。當系統中不存在其他使用者執行緒時,這些守護執行緒也會自動消亡。比如jvm的垃圾清理執行緒就是守護執行緒。我們可以使用如下方法檢視和設定執行緒是否是守護執行緒。

thread.isdaemon();

thread.setdaemon(true);

thread類中有乙個靜態的sleep方法,當乙個執行中的執行緒呼叫了thread的sleep方法後,呼叫執行緒會暫時讓出指定時間的執行權,也就是在這期間不參與cpu的排程,但是該執行緒所擁有的監視器資源,比如鎖還是持有不讓出的。指定的睡眠時間到了後該函式會正常返回,執行緒就處於就緒狀態,然後參與cpu的排程,獲取到cpu資源後就可以繼續執行了。如果在睡眠期間其他執行緒呼叫了該執行緒的interrupt()方法中斷了該執行緒,則該執行緒會在呼叫sleep方法的地方丟擲interruptedexception異常而返回(進入waiting狀態執行緒的interrupt方法被呼叫,則這個執行緒會丟擲interruptedexception異常)。

開發過程中我們可能會有這樣的需求:多個執行緒分別載入資源,等這些執行緒資源載入完畢之後對這些資源做統一彙總處理。join方法就能實現類似的功能。

呼叫執行緒的join方法會使得呼叫執行緒進入waiting狀態,直到被呼叫的執行緒執行結束,呼叫執行緒才會重新獲得執行的機會。

public class mythread  

});thread1.start();

thread1.join();

system.out.println("main thread end...");}}

上面的**中,main執行緒呼叫了thread1的join方法,main執行緒會被掛起進入waiting狀態,直到thread1執行完畢之後,main執行緒才有機會重新獲得執行機會。另外,如果main執行緒的interrupt方法被其他執行緒呼叫,那麼main執行緒呼叫的join方法會丟擲interruptedexception異常。

join方法還有乙個過載方法,這個方法可以指定超時時間。

thread1.join(50);
如果thread1執行緒在50ms內還沒執行完,main執行緒就可以重新獲得執行機會。

執行緒呼叫yield方法(這個方法是thread的靜態方法)是在暗示讓這個執行緒讓出cpu資源,如果這個執行緒在執行乙個cpu時間,已經執行到一半了,呼叫yield之後這個執行緒會放棄剩下的一半cpu時間回到就緒狀態。但是需要注意的是執行緒可以完全忽略yield方法的呼叫,也就是yield方法並不是每次都呼叫成功的:

需要說明的是:interrupt()方法並不是中斷執行緒,而是中斷阻塞狀態,也就是將執行緒的[中斷標誌位]置為true。中斷後執行緒將繼續執行。

事實上,interrupt方法只是改變目標執行緒的中斷狀態(interrupt status),而那些會丟擲interruptedexception異常的方法,如wait、sleep、join等,都是在方法內部不斷地檢查中斷狀態的值。

幾個中斷方法的對比:

public boolean isinterrupted()
當執行緒為了等待一些特定條件的到來時,一般會呼叫sleep函式、wait系列函式或者join()函式來阻塞掛起當前執行緒。比如乙個執行緒呼叫了thread. sleep(3000),那麼呼叫執行緒會被阻塞,直到3s後才會從阻塞狀態變為啟用狀態。但是有可能在3s內條件已被滿足,如果一直等到3s後再返回有點浪費時間,這時候可以呼叫該執行緒的interrupt()方法,強制sleep方法丟擲interruptedexception異常而返回,執行緒恢復到啟用狀態。

多執行緒 Thread類 建立執行緒

package thread 建立執行緒方式一 繼承 thread 類 重寫方法 run 呼叫 start 開啟執行緒 public class onethread extends thread public static void main string args 可以看出,main 方法和 ru...

Thread執行緒類及多執行緒

1.程序 執行緒 併發 並行是什麼?1 程序 作業系統中可以執行多個任務 程式 這些執行的任務 程式 被稱為程序。程式的執行產生程序 記憶體空間 程式執行的堆疊 可以這樣說,程序是作為作業系統分配資源的基本單位。3 併發 執行緒是併發執行的。作業系統將時間化分為若干個片段 時間片 盡可能的均勻分配給...

多執行緒Thread類例項

基於tcp協議的socket通訊,實現多個使用者登入。建立乙個伺服器類server,乙個客戶端類client,乙個繼承於多執行緒類的serverthread,從而實現多個客戶端向單個伺服器的連線。server類 public class server catch ioexception e clie...