官术网_书友最值得收藏!

1.2 線程的創建與運行

在Java語言中,一個線程就是一個java.lang.Thread類的實例。因此,在Java語言中創建一個線程就是創建一個Thread類的實例,當然這離不開內存的分配。創建一個Thread實例與創建其他類的實例不同的是,Java虛擬機會為一個Thread實例分配兩種調用棧(Call Stack)所需的內存空間。這兩種調用棧一種用于跟蹤Java代碼間的調用關系,另一種用于跟蹤Java代碼與本地代碼(即Native代碼,通常是C代碼)的調用關系[2]

一個Thread實例可能對應兩個線程:一個是Java虛擬機中的線程(或稱之為Java線程),另一個是與Java虛擬機中的線程相對應的依賴于Java虛擬機宿主機操作系統的本地(Native)線程[3]。啟動一個Java線程只需要調用相應Thread實例的start方法即可。線程啟動后,當相應的線程被線程調度器調度至運行時,相應Thread實例的run方法就會被Java虛擬機調用,如清單1-2所示[4]

清單1-2 Java線程的創建與運行

在清單1-2中,我們通過新建一個Thread類實例來創建一個線程。Thread類的其中一個構造器支持傳入一個java.lang.Runnable接口實例,當相應線程運行時,該實例的run方法會被Java虛擬機調用。

如清單1-2所示的程序運行時輸出如下:

與清單1-1中的代碼相比,同樣的類Helper的同一個方法doSomething此時是由名為A-Worker-Thread的線程而非main線程負責執行的。這是因為在清單1-1中,類Helper的run方法由main線程所執行的main方法直接調用,而在清單1-2中,類Helper的run方法是由Java虛擬機通過其創建的線程(線程名為A-Worker-Thread)進行調用的。

在清單1-2中,對線程對象的start方法進行調用(thread.start())的這段代碼是運行在main方法中的,而main方法是由main線程負責執行的。因此,在這里我們所創建的線程thread就可以看成main線程的一個子線程,而main線程就是該線程的父線程。

在Java語言中,子線程是否是一個守護線程取決于其父線程:默認情況下父線程是守護線程則子線程也是守護線程,父線程是用戶線程則子線程也是用戶線程。當然,父線程在創建子線程后和啟動子線程前可以調用Thread實例的setDaemon方法來修改線程的這一屬性。

Thread類自身是一個實現java.lang.Runnable接口的對象,我們也可以通過定義一個Thread類的子類來創建線程,自定義的線程類要覆蓋其父類的run方法,如清單1-3所示。

清單1-3 以創建Thread子類的方式創建線程

主站蜘蛛池模板: 龙州县| 宜章县| 皮山县| 万载县| 皮山县| 阿拉善右旗| 桃源县| 宁化县| 榆林市| 乾安县| 平江县| 贵港市| 扶风县| 彭水| 邢台市| 礼泉县| 古蔺县| 高台县| 石柱| 江城| 安仁县| 玉林市| 城口县| 称多县| 惠水县| 江永县| 永修县| 武宁县| 井陉县| 固始县| 孝昌县| 寻乌县| 安平县| 正镶白旗| 赤城县| 来宾市| 沂水县| 容城县| 云浮市| 辽阳县| 日土县|