新四季網

java多線程新手教程(java基礎之多線程)

2023-05-14 23:00:42

公眾號程序猿冰冰,分享java乾貨

Java 給多線程編程提供了內置的支持。一條線程指的是進程中一個單一順序的控制流,一個進程中可以並發多個線程,每條線程並行執行不同的任務。

這裡定義和線程相關的另一個術語 - 進程:一個進程包括由作業系統分配的內存空間,包含一個或多個線程。一個線程不能獨立的存在,它必須是進程的一部分。一個進程一直運行,直到所有的非守護線程都結束運行後才能結束。

多線程能滿足程式設計師編寫高效率的程序來達到充分利用 CPU 的目的。

1.進程 & 線程

1.1進程

1.進程:正在運行的應用長鬚

2.是系統進行資源分配和調用的獨立單位

3.每一個進程都有它自己的內存空間和系統資源

1.2. 線程

1.線程:是進程中的單個順序控制流,是一條執行路徑

2.單線程:一個進程如果只有一條執行路徑,則稱為單線程程序

3.多線程:一個進程如果有多條執行路徑,則稱為多線程程序

一個線程的生命周期

線程是一個動態執行的過程,它也有一個從產生到死亡的過程。

下圖顯示了一個線程完整的生命周期。

在線程的生命周期中,它要經過新建(New)、就緒(Runnable)、運行(Running)、阻塞(Blocked)死亡(Dead)5種狀態

新建狀態:使用 new 關鍵字和 Thread 類或其子類建立一個線程對象後,該線程對象就處於新建狀態。它保持這個狀態直到程序 start 這個線程。

就緒狀態:當線程對象調用了start方法之後,該線程處於就緒狀態。Java虛擬機會為其創建方法調用棧和程序計數器,等待調度運行

運行狀態:如果處於就緒狀態的線程獲得了CPU,開始執行run方法的線程執行體,則該線程處於運行狀態

阻塞狀態:當處於運行狀態的線程失去所佔用資源之後,便進入阻塞狀態

死亡狀態:線程在run方法執行結束後進入死亡狀態。此外,如果線程執行了interrupt或stop方法,那麼它也會以異常退出的方式進入死亡狀態。

可以對照上面的線程狀態流轉圖來看具體的方法,這樣更清楚具體作用:

1.start

啟動當前線程, 調用當前線程的run方法

2.run

通常需要重寫Thread類中的此方法, 將創建的線程要執行的操作聲明在此方法中

3.join

在線程a中調用線程b的join, 此時線程a進入阻塞狀態,直到線程b完全執行完以後, 線程a才結束阻塞狀態

4.sleep

讓線程睡眠指定的毫秒數,在指定時間內,線程是阻塞狀態

5.wait

一旦執行此方法,當前線程就會進入阻塞,一旦執行wait會釋放同步監視器。

6.sleep和wait的異同

相同點:

兩個方法一旦執行,都可以讓線程進入阻塞狀態。

不同點:

1.兩個方法聲明的位置不同:Thread類中聲明sleep,Object類中聲明wait

2.調用要求不同:sleep可以在任何需要的場景下調用。wait必須在同步代碼塊中調用。

線程的優先級

每一個線程都有一個優先級,這樣有助於作業系統確定線程的調度順序。

Java線程的優先級是一個整數,其取值範圍是 1 (Thread.MIN_PRIORITY) - 10 (Thread.MAX_PRIORITY )。

默認情況下,每一個線程都會分配一個優先級 NORM_PRIORITY(5)。

具有較高優先級的線程對程序更重要,並且應該在低優先級的線程之前分配處理器資源。但是,線程優先級不能保證線程執行的順序,而且非常依賴於平臺。

創建線程的三種方法

Java 提供了三種創建線程的方法:

1.通過實現 Runnable 接口

定義MyRunnable類實現Runnable接口;

實現run方法,編寫線程執行體;

創建線程對象,調用start方法啟動線程。

2.通過繼承 Thread 類本身

自定義線程類繼承Thread類

重寫run方法,編寫線程執行體

創建線程對象,調用start方法啟動線程

【注意】:線程開啟不一定立即執行,由CPU安排調度。

3.通過 Callable 和 Future 創建線程(了解)。

1. 創建 Callable 接口的實現類,並實現 call 方法,該 call 方法將作為線程執行體,並且有返回值。

2. 創建 Callable 實現類的實例,使用 FutureTask 類來包裝 Callable 對象,該 FutureTask 對象封裝了該 Callable 對象的 call 方法的返回值。

3. 使用 FutureTask 對象作為 Thread 對象的 target 創建並啟動新線程。

4. 調用 FutureTask 對象的 get 方法來獲得子線程執行結束後的返回值。

小結

1.繼承Thread類

(1)子類繼承Thread類具備多線程能力

(2)啟動線程:子類對象.start

(3)不建議使用:避免OOP單繼承局限性

2.實現Runnable接口

(1)實現接口Runnable具有多線程能力

(2)啟動線路:傳入目標對象 Thread對象.start

(3)推薦使用:避免單繼承局限性,靈活方便,方便同一個對象被多個線程使用

3.多線程的使用

有效利用多線程的關鍵是理解程序是並發執行而不是串行執行的。例如:程序中有兩個子系統需要並發執行,這時候就需要利用多線程編程。

通過對多線程的使用,可以編寫出非常高效的程序。不過請注意,如果你創建太多的線程,程序執行的效率實際上是降低了,而不是提升了。

請記住,上下文的切換開銷也很重要,如果你創建了太多的線程,CPU 花費在上下文的切換的時間將多於執行程序的時間!

java多線程就分享到這裡,希望對大家有幫助!

END

,
同类文章
葬禮的夢想

葬禮的夢想

夢見葬禮,我得到了這個夢想,五個要素的五個要素,水火只好,主要名字在外面,職業生涯良好,一切都應該對待他人治療誠意,由於小,吉利的冬天夢想,秋天的夢是不吉利的
找到手機是什麼意思?

找到手機是什麼意思?

找到手機是什麼意思?五次選舉的五個要素是兩名士兵的跡象。與他溝通很好。這是非常財富,它擅長運作,職業是仙人的標誌。單身男人有這個夢想,主要生活可以有人幫忙
我不怎麼想?

我不怎麼想?

我做了什麼意味著看到米飯烹飪?我得到了這個夢想,五線的主要土壤,但是Tu Ke水是錢的跡象,職業生涯更加真誠。他真誠地誠實。這是豐富的,這是夏瑞的巨星
夢想你的意思是什麼?

夢想你的意思是什麼?

你是什​​麼意思夢想的夢想?夢想,主要木材的五個要素,水的跡象,主營業務,主營業務,案子應該抓住魅力,不能疏忽,春天夢想的吉利夢想夏天的夢想不幸。詢問學者夢想
拯救夢想

拯救夢想

拯救夢想什麼意思?你夢想著拯救人嗎?拯救人們的夢想有一個現實,也有夢想的主觀想像力,請參閱週宮官方網站拯救人民夢想的詳細解釋。夢想著敵人被拯救出來
2022愛方向和生日是在[質量個性]中

2022愛方向和生日是在[質量個性]中

[救生員]有人說,在出生88天之前,胎兒已經知道哪天的出生,如何有優質的個性,將走在什麼樣的愛情之旅,將與生活生活有什么生活。今天
夢想切割剪裁

夢想切割剪裁

夢想切割剪裁什麼意思?你夢想切你的手是好的嗎?夢想切割手工切割手有一個真正的影響和反應,也有夢想的主觀想像力。請參閱官方網站夢想的細節,以削減手
夢想著親人死了

夢想著親人死了

夢想著親人死了什麼意思?你夢想夢想你的親人死嗎?夢想有一個現實的影響和反應,還有夢想的主觀想像力,請參閱夢想世界夢想死亡的親屬的詳細解釋
夢想搶劫

夢想搶劫

夢想搶劫什麼意思?你夢想搶劫嗎?夢想著搶劫有一個現實的影響和反應,也有夢想的主觀想像力,請參閱週恭吉夢官方網站的詳細解釋。夢想搶劫
夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂什麼意思?你夢想缺乏異常藥物嗎?夢想缺乏現實世界的影響和現實,還有夢想的主觀想像,請看官方網站的夢想組織缺乏異常藥物。我覺得有些東西缺失了