1. 程式人生 > >Java多執行緒3種實現方法

Java多執行緒3種實現方法

Java中的多執行緒有三種實現方式:
1.繼承Thread類,重寫run方法。Thread本質上也是一個實現了Runnable的例項,他代表一個執行緒的例項,並且啟動執行緒的唯一方法就是通過Thread類的start方法。
2.實現Runnable介面,並實現該介面的run()方法.建立一個Thread物件,用實現的Runnable介面的物件作為引數例項化Thread物件,呼叫此物件的start方法。
3.實現Callable介面,重寫call方法。Callable介面與Runnable介面的功能類似,但提供了比Runnable更強大的功能。有以下三點
1).Callable可以在人物結束後提供一個返回值,Runnable沒有提供這個功能。

2).Callable中的call方法可以丟擲異常,而Runnable的run方法不能丟擲異常。
3).執行Callable可以拿到一個Future物件,表示非同步計算的結果,提供了檢查計算是否完成的方法。

需要注意的是,無論用那種方式實現了多執行緒,呼叫start方法並不意味著立即執行多執行緒程式碼,而是使得執行緒變為可執行狀態。

run start的區別
start方法是啟動一個執行緒,而執行緒中的run方法來完成實際的操作。
如果開發人員直接呼叫run方法,那麼就會將這個方法當作一個普通函式來呼叫,並沒有多開闢執行緒,開發人員如果希望多執行緒非同步執行,則需要呼叫start方法。

sleep wait的區別

1.兩者處理的機制不同,sleep方法主要是,讓執行緒暫停執行一段時間,時間一到自動恢復,並不會釋放所佔用的鎖,當呼叫wait方法以後,他會釋放所佔用的物件鎖,等待其他執行緒呼叫notify方法才會再次醒來。
2.sleep是Threa的靜態方法,是用來控制執行緒自身流程的,而wait是object的方法,用於進行執行緒通訊。
3.兩者使用的區域不同。sleep可以在任何地方使用,wait必須放在同步控制方法,或者語句塊中執行。


synchronized notify wait的運用
synchronized關鍵字有兩種用法,synchronized方法和synchronized語句塊。
public synchronized void function(){}

synchronized(object){}
當某個資源被synchronized所修飾,執行緒1執行緒2等多個執行緒在共同請求這個資源,執行緒1先請求到,呼叫了物件的wait方法釋放了物件的鎖,此時執行緒2可以對這個物件進行訪問,在工作結束時可以呼叫物件的notify方法,喚醒等待佇列中正在等待的執行緒,此時被喚醒的執行緒將會再一次拿到物件鎖,對物件進行操作。可以呼叫notifyAll方法,喚醒等待佇列中的所有執行緒。

需要注意的是一個執行緒被喚醒不代表立即獲取物件鎖,必須等呼叫的執行緒物件的方法推出synchronized塊釋放物件鎖後,被喚醒的程序才會獲得物件鎖。