一、Java多線程機制
1、java的多線程機制
Java虛擬機快速地把控制從一個線程切換到另一個線程。每個應用程序都有一個缺省的線程。
2、線程的狀態和生命週期
線程的一個完整的生命週期主要經歷如下四個狀態:
(1)、新建
(2)、運行:線程必須調用start()方法通知JVM,這樣JVM就會知道又有一個新的線程排隊等候切換了
(3)、中斷:有四種中斷方式
JVM將CPU資源從當前線程切換到其他線程
線程調用sleep(int millsecond)方法
線程執行wait()方法
線程執行某個操作進入阻塞狀態
(4)、死亡
3、線程調度與優先級
JVM中的線程調度器負責管理線程,調度器把線程的優先級分爲10個級別,Java調度器的任務是使高優先級的線程能始終運行,一旦時間片空閒,則使其有相同優先級的線程
以輪流的方式順序使用時間片。
二、Thread類實現多線程
1、Thread的子類創建線程
在Java語言中,用Thread類或者子類創建線程對象。
在編寫Thread類的子類時,需要重寫父類的run()方法,目的是規定線程的具體操作,否則線程什麼也不做,因爲父類的run()方法中沒有任何操作語句。
三、Runnable接口實現多線程
1、使用Thread子類創建線程的優點:可以在子類中增加新的成員變量,也可以增加新的方法。
但是Java不支持多繼承,Thread類的子類不能再擴展其他的類
2、Runnable 接口與目標對象
創建線程的另一個途徑就是使用Thread類直接創建線程對象,使用Thread創建線程通常的構造方法:Thread (Runnable target);
在創建線程對象時必須向構造方法的參數傳遞一個實現Runnable接口類的實例,該實例對象稱作所創建線程的目標對象,當線程
調用start()方法後,一旦輪到它來享用CPU資源,目標對象就會自動調用接口中的run方法。
3、實現Runnable和繼承Thread的區別
(1)、一個類只能繼承一個父類,存在侷限;一個類可以實現多個接口
(2)、在實現Runnable接口的時候調用Thread(Runnable target)創建線程時,使用同一個Runnable實例,則建立的多線程的實例變量
也是共享的,但是通過Thread類是不能用一個實例建立多個線程,故而實現Runnable接口適合於資源共享。當然,繼承Thread類
也能共享變量,能共享Thread類的static變量。
(3)、Runnable接口和Thread之間的聯繫
public class Thread extends Object implements Runnable
可以看出Thread類也是Runnable接口的子類。
四、線程常用方法和線程同步
1、線程的常用方法
(1)、start():線程調用該方法將啓動線程
(2)、run():用來定義線程對象被調度之後所執行的操作
(3)、sleep(int millsecond); 優先級高的線程可以在他的run()方法中調用sleep方法來使自己放棄CPU資源,休眠一段時間
(4)、isAlive():在線程的run()方法結束之前,即沒有進入死亡狀態之前,線程調用isAlive()返回true。
(5)、currentThread():該方法是Thread類中的類方法,可以用類名調用,該方法返回當前正在使用CPU資源的線程。
(6)、interrupt():一個佔有CPU資源的線程可以讓休眠的線程調用interrupt()方法“吵醒”自己,即導致休眠的線程發生InterruptedException異常,從而結束休眠,重新排隊等待CPU資源。
2、線程同步
所謂線程同步就是若干個線程都需要使用一個synchronized修飾的方法,即程序中的若干線程都使用一個方法,這個方法用synchronized給予了修飾。
多個線程調用synchronized方法必須遵守同步機制:當一個線程使用這個方法時,其他線程想使用這個方法時必須等待,直到線程使用完該方法。在使用多線程解決許多實際問題時,可能要把某些
修改數據的方法用關鍵字synchronized來修飾。