上篇博客簡單了介紹了Java的多線程的概念,與進程的區別,兩種建立方式,狀態及獲取線程名稱等內容。這篇文章接着介紹Java的多線程。主要從一下幾方面介紹。java
啓動線程執行run方法編程
當前線程睡眠/millis的時間(millis指定睡眠時間是其最小的不執行時間,由於sleep(millis)休眠到達後,沒法保證會被JVM當即調度);多線程
sleep()是一個靜態方法(static method) ,因此他不會中止其餘的線程也處於休眠狀態;線程sleep()時不會失去擁有的對象鎖。spa
做用:保持對象鎖,讓出CPU,調用目的是不讓當前線程獨自霸佔該進程所獲取的CPU資源,以留必定的時間給其餘線程執行的機會。.net
讓出CPU的使用權,給其餘線程執行機會、讓同等優先權的線程運行(但並不保證當前線程會被JVM再次調度、使該線程從新進入Running狀態),若是沒有同等優先權的線程,那麼yield()方法將不會起做用。線程
強制執行該線程,該線程執行期間,其餘線程沒法運行,必須等該線程執行完畢後,才能執行其餘線程。對象
使線程進入到等待池(Waiting Pool)中,同時失去了對象的機鎖---暫時的,wait後還要返還對象鎖。當前線程必須擁有當前對象的鎖,若是當前線程不是此鎖的擁有者,會拋出IllegalMonitorStateException異常,因此wait()必須在synchronized block中調用。blog
喚醒在當前對象等待池中等待的第一個線程/全部線程。notify()/notifyAll()也必須擁有相同對象鎖,不然也會拋出IllegalMonitorStateException異常。進程
1.sleep()方法資源
sleep()使當前線程進入停滯狀態(阻塞當前線程),讓出CUP的使用、目的是不讓當前線程獨自霸佔該進程所獲的CPU資源,以留必定時間給其餘線程執行的機會。
sleep()是Thread類的Static(靜態)的方法;所以他不能改變對象的機鎖,因此當在一個Synchronized塊中調用Sleep()方法是,線程雖然休眠了,可是對象的機鎖並木有被釋放,其餘線程沒法訪問這個對象(即便睡着也持有對象鎖)。
在sleep()休眠時間期滿後,該線程不必定會當即執行,這是由於其它線程可能正在運行並且沒有被調度爲放棄執行,除非此線程具備更高的優先級。
2. wait()方法
wait()方法是Object類裏的方法;當一個線程執行到wait()方法時,它就進入到一個和該對象相關的等待池中,同時失去(釋放)了對象的機鎖(暫時失去機鎖,wait(long timeout)超時時間到後還須要返還對象鎖),其餘線程能夠訪問。
wait()使用notify或者notifyAlll或者指定睡眠時間來喚醒當前等待池中的線程。
wiat()必須放在synchronized block中,不然會在program runtime時扔出"java.lang.IllegalMonitorStateException"異常。總結一下:
sleep()睡眠時,保持對象鎖,仍然佔有該鎖。
wait()睡眠時,釋放對象鎖。
參考: