菜鳥的進階之路:了解使用多線程
溫馨提示
如果你喜歡本文,請分享到朋友圈,想要獲得更多信息,請關注我。
小菜鳥
大菜鳥,什么是多線程?
多線程其實就是指一個程序運行時產生多個線程去執行。
大菜鳥
小菜鳥
哦哦,那多線程和多進程有什么區別嗎?
關于多進程和多線程,教科書上最經典的一句話是“進程是資源分配的最小單位,線程是CPU調度的最小單位”,一般來說進程是獨立的而同一進程中的線程是共享的,但是開一個進程的成本遠高于線程。但是進程隔離度比較高,線程使用的成本比較低但是對我們的掌控度控制的比較高。線程相互印象出問題的幾率也是很高的。然后線程和進程一樣分為五個階段:創建、就緒、運行、阻塞、終止。
大菜鳥
小菜鳥
那他們都各有什么優缺點。
這個的話我給你找了一張圖,可以清晰的了解它們之間的優缺點
(源網絡。侵刪)
大菜鳥
小菜鳥
明白了。但是線程的話在Java中怎么去使用線程呢呢。
在Java中使用線程之前首先你要先了解線程的狀態。
大菜鳥
上面就說到。線程和進程一樣有五個狀態分別是創建、就緒、運行、阻塞、終止。在Java中去實現的話有三種方法去實現,一種就是通過繼承Thread類去實現。還有就是通過實現Runable接口,最后一種是實現Callable接口要和線程池配合使用。這個就教你了。這里是線程的狀態圖
(源網絡。侵刪)
大菜鳥
小菜鳥
那Thread和Runable有什么區別呢?
簡單的來說如果一個類繼承Thread,則不適合資源共享。但是如果實現了Runable接口的話,則很容易的實現資源共享。
大菜鳥
小菜鳥
那上面的狀態都對應了什么操作?
1、新建狀態(New):新創建了一個線程對象。2、就緒狀態(Runnable):線程對象創建后,其他線程調用了該對象的start()方法。該狀態的線程位于可運行線程池中,變得可運行,等待獲取CPU的使用權。3、運行狀態(Running):就緒狀態的線程獲取了CPU,執行程序代碼。4、阻塞狀態(Blocked):阻塞狀態是線程因為某種原因放棄CPU使用權,暫時停止運行。直到線程進入就緒狀態,才有機會轉到運行狀態。阻塞的情況分三種:(一)、等待阻塞:運行的線程執行wait()方法,JVM會把該線程放入等待池中。(wait會釋放持有的鎖)(二)、同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占用,則JVM會把該線程放入鎖池中。(三)、其他阻塞:運行的線程執行sleep()或join()方法,或者發出了I/O請求時,JVM會把該線程置為阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉入就緒狀態。(注意,sleep是不會釋放持有的鎖)5、死亡狀態(Dead):線程執行完了或者因異常退出了run()方法,該線程結束生命周期。
大菜鳥
小菜鳥
sleep和wait什么區別?
sleep是Thread類的方法,wait是Object類中定義的方法,sleep睡眠時保持鎖,wait睡眠時釋放鎖。這也是面試官進場問的一個面試題
大菜鳥
小菜鳥
哦哦。都知道了。那我如何去使用呢。
Java中使用的話可以這樣通過Thread實現
大菜鳥
運行結果。
大菜鳥
或者通過Runable實現接口。
大菜鳥
運行結果:
大菜鳥
小菜鳥
很簡單呀,那我怎么讓線程等待呢?
可以使用sleep。注意sleep需要傳遞等待時間是以毫秒為單位的
大菜鳥
小菜鳥
學到了。我去練習一下。
其實相對來說我給你介紹的很簡單很簡單。只是給你說一些概念和怎么去使用。更深入的有機會在給你講解。多線程可不止這一點哦
大菜鳥
任務調度 多線程
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。