溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java多線程概念知識點有哪些

發(fā)布時間:2021-11-24 15:28:49 來源:億速云 閱讀:133 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“Java多線程概念知識點有哪些”,在日常操作中,相信很多人在Java多線程概念知識點有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java多線程概念知識點有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

線程安全:

通過加鎖保證數(shù)據(jù)的一致性.也就是說當一個線程訪問某個數(shù)據(jù)時,通過加鎖操作對數(shù)據(jù)進行保護,其它線程在加鎖期間不能對其訪問

線程封閉

當多個線程訪問共享變量時,需要通過加鎖來保證數(shù)據(jù)同步,增加了程序的復雜性. 避免數(shù)據(jù)同步的一種方式是不共享變量,比如使用局部變量和ThreadLocal

線程調(diào)度

系統(tǒng)為線程分配CUP使用權(quán)的過程

  • 協(xié)同式線程調(diào)度

線程的執(zhí)行時間由線程自己控制,當自己執(zhí)行完后,主動通知操作系統(tǒng)切換到另外一個線程上執(zhí)行. 好處是實現(xiàn)簡單,線程對自己的操作是可知道的,沒有什么線程同步問題.缺點是線程執(zhí)行時間不可控,如果一個線程有問題,可能會一致阻塞在那里.

  • 搶占式線程調(diào)度

每個線程的執(zhí)行時間有操作系統(tǒng)分配,線程的切換不由線程本身決定(Java中,Thread.yield()可以讓出執(zhí)行時間,但無法獲取執(zhí)行時間)線程執(zhí)行時間系統(tǒng)可控,也不會有一個線程導致進程阻塞.

java線程調(diào)度就是搶占式調(diào)度

可以通過設(shè)置線程的優(yōu)先級讓一些線程盡可能的先執(zhí)行多執(zhí)行(Java一共有10個線程優(yōu)先級從Thread.MIN_PRIORITY至Thread.MAX_PRIORITY),在兩個線程同時處于ready時,優(yōu)先級越高越容易被執(zhí)行.但優(yōu)先級并不靠譜,因為Java線程時通過映射到原生線程來實現(xiàn)的,所以線程調(diào)度還是取決于操作系統(tǒng).

狀態(tài)轉(zhuǎn)換

  • 新建(New)創(chuàng)建后尚未啟動的線程

  • 運行(Runnable):Runnable包括操作系統(tǒng)中的Running和Ready. 處于此狀態(tài)的線程有可能在運行,也有可能在等待CPU為它分配執(zhí)行時間.線程創(chuàng)建后,其它線程調(diào)用了該線程的start方法,那么該線程就位于可運行線程池中,變得可運行,就差CPU分配執(zhí)行時間,其它運行所需要的資源都已經(jīng)獲得.

  • 無限期等待(Waiting):該狀態(tài)下的線程不會被分配CPU執(zhí)行時間,要等待被其它線程進行顯示喚醒. 如沒有設(shè)置timeout的Object.wait()方法和Thread.join()方法,以及LockSupport.park()方法

  • 限時等待(Timed Waiting):該狀態(tài)下的線程不會被分配CPU執(zhí)行時間,只不過不需要被顯示的喚醒,在一定時間后會被系統(tǒng)自動喚醒. 如Thread.sleep(),設(shè)置了timeout的Object.wait()和Thread.join(),LockSupport.parkNanos()以及LockSupport.parkUntil()方法

  • 阻塞(Blocked):線程被阻塞了,與等待的區(qū)別是:阻塞線程在等待一個排它鎖.

阻塞狀態(tài)是因為某種原因放棄CPU使用權(quán),暫時停止執(zhí)行,直到線程進入就緒狀態(tài),才有機會轉(zhuǎn)到運行狀態(tài).

  • 結(jié)束(Terminated):線程執(zhí)行完了或者異常退出了run()方法,該線程結(jié)束生命周期

阻塞常見的三種情況

1.等待阻塞(無限期等待):運行的線程執(zhí)行wait()方法,該線程會釋放占用的資源,JVM會把該線程放入等待池.進入這個狀態(tài)后,線程不會自動喚醒,必須依靠其它線程調(diào)用notify()或notifyAll()方法才能會被喚醒.

2.同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被其它線程占用,則JVM會把該線程放入鎖池. 3.其它阻塞(限時等待):運行的線程執(zhí)行了join()或者sleep()方法,或者發(fā)起了I/O請求,JVM會把該線程置為阻塞狀態(tài),當sleep()狀態(tài)超時,join()等待線程終止或者超時,I/O處理完成,該線程重新轉(zhuǎn)入就緒狀態(tài).

到此,關(guān)于“Java多線程概念知識點有哪些”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI