java多線程的操做

上篇博客簡單了介紹了Java的多線程的概念,與進程的區別,兩種建立方式,狀態及獲取線程名稱等內容。這篇文章接着介紹Java的多線程。主要從一下幾方面介紹。java

1 線程類的經常使用方法

1.1 start()

啓動線程執行run方法編程

1.2 Thread.sleep()/sleep(long millis)

當前線程睡眠/millis的時間(millis指定睡眠時間是其最小的不執行時間,由於sleep(millis)休眠到達後,沒法保證會被JVM當即調度);多線程

sleep()是一個靜態方法(static method) ,因此他不會中止其餘的線程也處於休眠狀態;線程sleep()時不會失去擁有的對象鎖。spa

做用:保持對象鎖,讓出CPU,調用目的是不讓當前線程獨自霸佔該進程所獲取的CPU資源,以留必定的時間給其餘線程執行的機會。.net

1.3 Thread.yield()

讓出CPU的使用權,給其餘線程執行機會、讓同等優先權的線程運行(但並不保證當前線程會被JVM再次調度、使該線程從新進入Running狀態),若是沒有同等優先權的線程,那麼yield()方法將不會起做用。線程

1.4  Thread.join()

 強制執行該線程,該線程執行期間,其餘線程沒法運行,必須等該線程執行完畢後,才能執行其餘線程。對象

1.5  object.wait()

使線程進入到等待池(Waiting Pool)中,同時失去了對象的機鎖---暫時的,wait後還要返還對象鎖。當前線程必須擁有當前對象的鎖,若是當前線程不是此鎖的擁有者,會拋出IllegalMonitorStateException異常,因此wait()必須在synchronized block中調用。blog

1.6 Object.notify()/notifyAll()

 喚醒在當前對象等待池中等待的第一個線程/全部線程。notify()/notifyAll()也必須擁有相同對象鎖,不然也會拋出IllegalMonitorStateException異常。進程

1.7Object.wait()和Thread.sleep(long)的區別

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()睡眠時,釋放對象鎖。

 

2 線程的終止

3 線程的同步問題

 

 

參考:

 

Java多線程看我這一篇就足夠了

java多線程-概念&建立啓動&中斷&守護線程&優先級&線程狀態(多線程編程之一)

Java Thread 總結

相關文章
相關標籤/搜索