在程序中啓動一個新線程運行一段代碼有兩種方式
一.繼承Thread類
1.子類覆蓋父類中的run方法,將線程運行的代碼存放在run中。
2.建立子類對象的同時線程也被創建。
3.通過調用start方法開啓線程。
二.實現Runnable接口
1.子類覆蓋接口中的run方法。
2.通過Thread類創建線程,並將實現了Runnable接口的子類對象作爲參數傳遞給Thread類的構造函數。
3.Thread類對象調用start方法開啓線程。
Thread常用方法:
start(); -->啓動線程。
sleep(); -->線程休眠。
getName(); -->獲取當前線程的名稱。
currentThread(); -->獲取當前線程對象。
interrupt(); -->中斷線程的凍結狀態,使線程回到運行狀態,並拋出異常。
setPriority(int num);-->設置線程優先級。
setDaemon(boolean b); -->設置是否是守護線程,即後臺線程,前臺線程結束,守護線程自動結束。
join(); -->當A線程執行到B線程的join()方法時,A線程會等待B線程結束後,再繼續執行。
yield(); -->放棄CPU控制權。
wait(); -->線程等待。
notify();-->喚醒第一個等待的線程。
notifyAll();-->喚醒所有等待的線程。
由於線程同步synchronized效率低,在JDK1.5中被Lock接口所替代。
ReentrantLock實現了Lock接口,常被Lock實例化;一個Lock對象上允許創建多個Condition對象。
Lock常用方法:
lock(); -->加鎖
unlock(); -->解鎖
Condition常用方法:
await(); -->Condition上的線程等待。
signal(); -->喚醒Condition上第一個等待的線程。
signalAll(); -->喚醒Condition上所有等待的線程。