- Java多線程編程實戰指南:設計模式篇(第2版)
- 黃文海
- 831字
- 2021-10-15 19:24:51
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子類的方式創建線程

- C語言程序設計實踐教程(第2版)
- Building a Game with Unity and Blender
- Reactive Programming with Swift
- Lua程序設計(第4版)
- Visual C#.NET程序設計
- Haxe Game Development Essentials
- Apache Spark 2.x for Java Developers
- Visual Basic程序設計實驗指導(第二版)
- Vue.js 2 Web Development Projects
- Unity 2018 Augmented Reality Projects
- Arduino可穿戴設備開發
- 分布式數據庫原理、架構與實踐
- Java EE Web應用開發基礎
- Mastering Embedded Linux Programming
- JavaEE架構與程序設計