本篇博客在上一篇博客的基礎上,繼續對多線程的基礎進行探討。在本篇博客中,咱們將涉及多線程的中經常使用函數的說明、高級線程類的使用。程序員
在上一篇博客中,咱們瞭解了線程的狀態,而如何控制這些狀態來對線程進行調度呢,答案便在接下來的內容中。多線程
在指定的毫秒數內讓當前正在執行的線程休眠(暫停執行)。值得注意的是:在線程休眠期間,不會釋放鎖。函數
可見,這是一個靜態方法。它屬於Thread類。spa
join是Thread類的一個方法,啓動線程後直接調用,即join()的做用是:「等待該線程終止」。這裏須要理解的就是該線程是指的主線程等待子線程的終止,也就是在子線程調用了join()方法後面的代碼,只有等到子線程結束了才能執行。線程
爲何要用join()方法呢? 在不少狀況下,主線程生成並起動了子線程,若是子線程裏要進行大量的耗時的運算,主線程每每將於子線程以前結束,可是若是主線程處理完其餘的事務後,須要用到子線程的處理結果,也就是主線程須要等待子線程執行完成以後再結束,這個時候就要用到join()方法了。對象
如下圖爲演示代碼:事務
在沒有使用join方法的狀況下:博客
------------------------------------------------------------------------------------------------------it
運行結果:io
使用join方法後:
---------------------------------------------------------------------------------------------------
運行結果:
Thread.yield()方法做用是:暫停當前正在執行的線程對象,並執行其餘線程。
yield()應該作的是讓當前運行線程回到可運行狀態(runnable),以容許具備相同優先級的其餘線程得到運行機會。所以,使用yield()的目的是讓相同優先級的線程之間能適當的輪轉執行。實際上,yield()方法對應了以下操做:先檢測當前是否有相同優先級的線程處於同可運行狀態,若有,則把 CPU 的佔有權交給此線程,不然,繼續運行原來的線程。因此yield()方法稱爲「退讓」,它把運行機會讓給了同等優先級的其餘線程
實際中沒法保證yield()達到讓步目的。由於當讓步的程序回到可運行狀態的時候,也有可能會被CPU選中執行,由於CPU在選擇某一個線程的時候隨機的。
設置線程的優先級(值在1-10之間),在Thread中有三個常數,分別爲:
MIN_PRIORITY = 1
NORM_PRIORITY = 5
MAX_PRIORITY = 10
若是一個線程處於了阻塞狀態(如線程調用了thread.sleep、thread.join、thread.wait、1.5中的condition.await、以及可中斷的通道上的 I/O 操做方法後可進入阻塞狀態),則在線程在檢查中斷標示時若是發現中斷標示爲true,則會在這些阻塞方法(sleep、join、wait、1.5中的condition.await及可中斷的通道上的 I/O 操做方法)調用處拋出InterruptedException異常,而且在拋出異常後當即將線程的中斷標示位清除,即從新設置爲false。拋出異常是爲了線程從阻塞狀態醒過來,並在結束線程前讓程序員有足夠的時間來處理中斷請求。
注,synchronized在獲鎖的過程當中是不能被中斷的,意思是說若是產生了死鎖,則不可能被中斷。與synchronized功能類似的reentrantLock.lock()方法也是同樣,它也不可中斷的,即若是發生死鎖,那麼reentrantLock.lock()方法沒法終止,若是調用時被阻塞,則它一直阻塞到它獲取到鎖爲止。可是若是調用帶超時的tryLock方法reentrantLock.tryLock(long timeout, TimeUnit unit),那麼若是線程在等待時被中斷,將拋出一個InterruptedException異常,這是一個很是有用的特性,由於它容許程序打破死鎖。你也能夠調用reentrantLock.lockInterruptibly()方法,它就至關於一個超時設爲無限的tryLock方法
代碼演示1:
-------------------------------------------------------------------------------------------------------------
運行結果:
如運行結果所示,當調用Thread.interrupt()後,Thread.sleep()會拋出一個InterruptedExamption異常,但線程並不會結束。但若是要使程序結束,能夠這樣作:
演示代碼2:
-------------------------------------------------------------------------------------------------------------
運行結果:
未完成..........