這篇文章主要介紹“Java多線程概念知識點有哪些”,在日常操作中,相信很多人在Java多線程概念知識點有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java多線程概念知識點有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
通過加鎖保證數據的一致性.也就是說當一個線程訪問某個數據時,通過加鎖操作對數據進行保護,其它線程在加鎖期間不能對其訪問
當多個線程訪問共享變量時,需要通過加鎖來保證數據同步,增加了程序的復雜性. 避免數據同步的一種方式是不共享變量,比如使用局部變量和ThreadLocal
系統為線程分配CUP使用權的過程
協同式線程調度
線程的執行時間由線程自己控制,當自己執行完后,主動通知操作系統切換到另外一個線程上執行. 好處是實現簡單,線程對自己的操作是可知道的,沒有什么線程同步問題.缺點是線程執行時間不可控,如果一個線程有問題,可能會一致阻塞在那里.
搶占式線程調度
每個線程的執行時間有操作系統分配,線程的切換不由線程本身決定(Java中,Thread.yield()可以讓出執行時間,但無法獲取執行時間)線程執行時間系統可控,也不會有一個線程導致進程阻塞.
可以通過設置線程的優先級讓一些線程盡可能的先執行多執行(Java一共有10個線程優先級從Thread.MIN_PRIORITY至Thread.MAX_PRIORITY),在兩個線程同時處于ready時,優先級越高越容易被執行.但優先級并不靠譜,因為Java線程時通過映射到原生線程來實現的,所以線程調度還是取決于操作系統.
新建(New)創建后尚未啟動的線程
運行(Runnable):Runnable包括操作系統中的Running和Ready. 處于此狀態的線程有可能在運行,也有可能在等待CPU為它分配執行時間.線程創建后,其它線程調用了該線程的start方法,那么該線程就位于可運行線程池中,變得可運行,就差CPU分配執行時間,其它運行所需要的資源都已經獲得.
無限期等待(Waiting):該狀態下的線程不會被分配CPU執行時間,要等待被其它線程進行顯示喚醒. 如沒有設置timeout的Object.wait()方法和Thread.join()方法,以及LockSupport.park()方法
限時等待(Timed Waiting):該狀態下的線程不會被分配CPU執行時間,只不過不需要被顯示的喚醒,在一定時間后會被系統自動喚醒. 如Thread.sleep(),設置了timeout的Object.wait()和Thread.join(),LockSupport.parkNanos()以及LockSupport.parkUntil()方法
阻塞(Blocked):線程被阻塞了,與等待的區別是:阻塞線程在等待一個排它鎖.
阻塞狀態是因為某種原因放棄CPU使用權,暫時停止執行,直到線程進入就緒狀態,才有機會轉到運行狀態.
結束(Terminated):線程執行完了或者異常退出了run()方法,該線程結束生命周期
1.等待阻塞(無限期等待):運行的線程執行wait()方法,該線程會釋放占用的資源,JVM會把該線程放入等待池.進入這個狀態后,線程不會自動喚醒,必須依靠其它線程調用notify()或notifyAll()方法才能會被喚醒.
2.同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被其它線程占用,則JVM會把該線程放入鎖池. 3.其它阻塞(限時等待):運行的線程執行了join()或者sleep()方法,或者發起了I/O請求,JVM會把該線程置為阻塞狀態,當sleep()狀態超時,join()等待線程終止或者超時,I/O處理完成,該線程重新轉入就緒狀態.
到此,關于“Java多線程概念知識點有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。