a、第一種:繼承Thread線程類,然後重寫他的run方法。因爲此時Thread類的Runnable成員變量爲null,所以此時Thread類的run()方法不執行任何動作。當想要啓動線程時必須要調用start()方法,不能調用run()方法,當用線程類調用run()方法,這是的線程類類就變成普通的類了。
b、第二種:實現Runnable接口,然後實現他的run方法。
2)、當想要停止運行線程時,不要調用stop()方法,因爲stop()方法不是線程安全的。推薦方式是:將run()方法內的執行代碼放在一個while循環內,當爲true時線程繼續執行,當爲false時退出線程的執行。
3)、線程的狀態:
a、創建狀態:當用new操作符創建一個新的線程對象是,該線程就進入的創建狀態。此時的狀態並沒有分配資源。
b、可運行狀態:當線程對象執行start()方法後,系統將爲線程分配需要的系統資源,安排其運行,線程此時就會去掉run()方法,這時線程就處於可運行狀態了。注意:此時線程還並未真正執行。
c、不可運行狀態:
d、消亡狀態
4)、如果一個對象有多個synchronized方法,某一時刻某個線程已經進入到了某個synchronized方法,那麼在該方法沒有執行完畢前,其他線程時無法訪問該對象的任何synchronized方法的。
5)、如果某個synchronized方法是static的,那麼當線程訪問該方法時,他得鎖斌不是synchronized方法所在的對象,而是synchronized方法所在的對象所對應的Class對象,因爲Java中無論一個類有多少個對象,這些類會對應唯一一個Class對象。
6)、線程同步方法
wait():使一個線程處於等待狀態,並且釋放所持有的對象的lock。
sleep():使一個正在運行的線程處於睡眠狀態,是一個靜態方法,調用此方法要捕捉InterruptedException異常。
notify():喚醒一個處於等待狀態的線程,注意的是在調用此方法的時候,並不能確切的喚醒某一個等待狀態的線程,而是由JVM確定喚醒哪個線程,而且不是按優先級。
notityAll ():喚醒所有處入等待狀態的線程,注意並不是給所有喚醒線程一個對象的鎖,而是讓它們競爭。