執行緒是指程式在執行過程中,能夠執行程式**的乙個執行單元。執行緒也被稱為輕量級程序,它是程式執行的最小單元,乙個程序可以擁有多個執行緒,各個執行緒之間共享程式的記憶體空間(堆空間、常量池),但是各個執行緒擁有自己的棧空間。
多執行緒對於程式的執行有以下幾點好處:
可以減少程式的響應時間;
與程序相比,執行緒的建立和切換開銷更小;
能夠提高cpu的利用率;
能簡化程式的結構,使程式便於理解和維護。
主要步驟:
1)自定義mythread類繼承thread類,重寫run()方法;;
2)建立mythread類的物件;
3)呼叫run()方法;
pubilc mythread extends thread
}public class test
}
主要步驟:
1)自定義mythread類實現runnable介面,重寫run()方法;;
2)用實現runnable介面的實現類mythread類的物件作為引數,建立thread類的物件;
3)呼叫thread類的run()方法;
pubilc mythread implements runnable
}public class test
}
上述兩種實現多執行緒的方式,一般推薦實現runnable介面的方式。因為乙個類在需要被加強或修改時我們才會去繼承它,thread類中有很多方法,只有run()方法是必須要重寫的,而runnable介面中只有乙個run()方法。所以從這個角度考慮,實現runnable介面更好些。
通常,系統通過呼叫執行緒類的start()方法來啟動乙個執行緒,此時該執行緒處於就緒狀態,也就意味著這個執行緒可以被jvm來排程執行。在排程過程中,jvm通過呼叫執行緒類的run()方法來完成實際的操作,當run()方法結束後,執行緒終止。
如果直接呼叫run()方法,相當於乙個普通方法的呼叫,程式中只有主線程這乙個執行緒。
1)原理不同。sleep()方法是thread類的靜態方法,是執行緒用於控制自身流程的。必須指定時間,時間一到,執行緒自動甦醒。wait()方法是object的方法,用於執行緒間的通訊。當呼叫notify()方法(或notifyall()方法)時,執行緒甦醒,也可以指定乙個時間,時間一到,執行緒自動甦醒。
2)對鎖的處理機制不同。執行緒呼叫sleep()方法不會釋放鎖;執行緒呼叫wait()方法時會釋放鎖。
3)使用區域不同。sleep()法可以放在任何地方使用;而wait()方法必須放在同步方法或同步**塊中使用。
4)丟擲異常不同。sleep()方法宣告丟擲interruptedexception異常;而wait()方法沒有宣告任何異常。
ps:sleep()方法與yield()方法(執行緒的禮讓方法)的區別
1)sleep()方法結束後,執行緒的執行不考慮優先順序(沒有進行執行緒同步),低優先順序的執行緒也能得到執行權;而yield()方法結束後,只有相同優先順序或高優先順序的執行緒能夠得到執行權。
2)執行緒執行sleep()方法後會轉入阻塞狀態,指定時間內不會被執行;而yield()方法是讓當前執行緒重新回到就緒狀態,有可能馬上被執行。
3)sleep()方法宣告丟擲interruptedexception異常;而yield()方法沒有宣告任何異常。
4)sleep()方法比yield()方法具有更好的移植性。
關於多執行緒同步,本人懂得比較淺,這裡引用一位大神的部落格,共同分享、共同學習。
ps:當乙個執行緒執行乙個物件的普通synchronized()方法後,其他執行緒可執行該物件的所有非synchnized()方法和靜態synchronized()方法(靜態方法用的同步鎖是當前類的位元組碼,非靜態方法用的是當前物件)。
1)用法不同。synchronized既可以加在方法上,也可以加在特定**塊中(需指明鎖物件)。而lock需要顯示地指定起始位置和終止位置。
2)效能不同。在資源競爭不是很激烈的情況下,synchronized的效能優於lock介面的實現類reetrantlock;但是在資源競爭很激烈的情況下,synchronized的效能下降的很快,而reetrantlock的效能基本保持不變。
3)鎖機制不同。synchronized獲得鎖和釋放的方式都是在塊結構中,當獲取多個鎖時,必須以相反的順序釋放鎖,並且是自動解鎖,不會因為出了異常而導致鎖沒有被釋放引發死鎖。而lock需要開發人員手動去釋放鎖,並且必須在finally塊中釋放,否則會引發死鎖。此外,lock的trylock()方法可以採用非阻塞的方式去獲取鎖。
Java多執行緒總結
life s a climb,but the view is great.1.1 繼承thread 1.2 實現runnable 1.3 實現callable2.1 五種狀態 建立,就緒,執行,阻塞,死亡 2.2終止執行緒 自然終止 外部干涉 2.3 阻塞 join yield sleep slee...
Java 多執行緒總結
class mythread extends threadcatch interruptedexception e system.out.println mythread running public class threadtest mythread t new mythread 建立了乙個子執行...
Java 多執行緒學習總結2
併發執行最理想的狀況是讓一些 毫不相干 的somebody 自己做自己的事情,和別人無關。但是事實讓確非如此,因為在哲學上講,世界是乙個整體,每個個體之間都存在聯絡,我們讓一些東西不相干,是我們人類為了簡化問題,而從概念上進行的分割劃分,呵呵。事實上,如果某個somebody 為多個執行緒共享,其中...