1. 程式人生 > >執行緒概念,狀態及狀態之間的關係,實現多執行緒方法,實現同步執行緒的方式

執行緒概念,狀態及狀態之間的關係,實現多執行緒方法,實現同步執行緒的方式

1.執行緒概念:是程序中的一個執行控制單元,執行路徑;一個程序中至少有一個執行緒在負責控制程式稱為單執行緒;一個程序中有多個執行路徑時,這個程式稱為多執行緒

2.狀態:就緒,執行,synchronize阻塞,wait和sleep掛起,結束

3.狀態之間的關係:呼叫執行緒的start()方法進入就緒狀態,執行緒排程系統將就緒狀態的執行緒轉為執行狀態,遇到synchronize語句時,由執行狀態轉為阻塞,當synchronize獲得鎖後,由阻塞轉為執行,在這種情況下可以呼叫wait方法轉為掛起狀態,當執行緒關聯的程式碼執行完後,執行緒變為結束狀態

4.實現多執行緒的方法:有兩種分別是 繼承Thread類和實現Runnable介面

5.實現同步執行緒的方式:有兩種分別是  分別是synchronized,wait與notify

wait():使一個執行緒處於等待狀態,並且釋放所持有的物件的lock。

sleep():使一個正在執行的執行緒處於睡眠狀態,是一個靜態方法,呼叫此方法要捕捉InterruptedException異常。

notify():喚醒一個處於等待狀態的執行緒,注意的是在呼叫此方法的時候,並不能確切的喚醒某一個等待狀態的執行緒,而是由JVM確定喚醒哪個執行緒,而且不是按優先順序。

Allnotity():喚醒所有處入等待狀態的執行緒,注意並不是給所有喚醒執行緒一個物件的鎖,而是讓它們競爭。

sleep就是正在執行的執行緒主動讓出cpu,cpu去執行其他執行緒,在sleep指定的時間過後,cpu才會回到這個執行緒上繼續往下執行,如果當前執行緒進入了同步鎖,sleep方法並不會釋放鎖,即使當前執行緒使用sleep方法讓出了cpu,但其他被同步鎖擋住了的執行緒也無法得到執行。

wait是指在一個已經進入了同步鎖的執行緒內,讓自己暫時讓出同步鎖,以便其他正在等待此鎖的執行緒可以得到同步鎖並執行,只有其他執行緒呼叫了notify方法(notify並不釋放鎖,只是告訴呼叫過wait方法的執行緒可以去參與獲得鎖的競爭了,但不是馬上得到鎖,因為鎖還在別人手裡,別人還沒釋放。如果notify方法後面的程式碼還有很多,需要這些程式碼執行完後才會釋放鎖),呼叫wait方法的執行緒就會解除wait狀態和程式可以再次得到鎖後繼續向下執行

當一個執行緒進入一個物件的一個synchronized方法後,其它執行緒是否可進入此物件的其它方法?

分幾種情況:

     1.其他方法前是否加了synchronized關鍵字,如果沒加,則能。

     2.如果這個方法內部呼叫了wait,則可以進入其他synchronized方法。

     3.如果其他個方法都加了synchronized關鍵字,並且內部沒有呼叫wait,則不能。

     4.如果其他方法是static,它用的同步鎖是當前類的位元組碼,與非靜態的方法不能同步,因為非靜態的方法用的是this。