基本概念
進程和線程
- 進程
進程是系統進行資源分配的最小單位,其中資源包括:CPU 、內存空間、磁盤IO等 - 線程
線程是CPU調度的最小單位,必須依賴于進程而存在
Java中的線程
一個Java程序從main()方法執行開始,就會產生多個工作線程,線程內容如下:
- Monitor Ctrl-Break 監控Ctrl-break中斷信號
- Attach Listener 內存dump,線程dump,類信息統計,獲取系統屬性等。
- Signal Dispatcher 分發給JVM信號的線程
- Finalizer 調用對象finalize 方法的線程
- Reference Handler 清除Reference的線程
- main 程序入口
線程的啟動和終止
啟動
Java中啟動線程的方式只有2種:
- 繼承于Thread,然后調用start方法
- 實現runnable 接口,然后交給Thread執行
中斷
線程自然終止
自然終止有2種情況,第一個是run方法執行完成,第二是拋出一個未處理的異常導致線程提前結束。
中斷
安全中止則是由其他線程通過調用某個線程的interrupt方法對進行中斷操作,該中斷操作只是對該線程進行了中斷標記,并不代表線程A會立即停止操作,因此線程完全可以不理會這種中斷請求。線程通過isInterrupted來進行判斷是否被中斷,也可以調用Thread.interrupted()來進行判斷當前線程是否被中斷,但是Thread.interrupted()會同時將中斷標識改寫為false。如果一個線程處于阻塞狀態,則再線程檢查中斷中斷標識時如果發現中斷標示為true,則會再這些阻塞方法調用出拋出InterruptedException異常,并且再拋出后將線程的中斷標示位清除,即重新設置位false。
線程中的方法
- yield方法:使當前線程讓出CPU占有權,但讓出時間是不可設定的。也不會釋放資源。所有執行yield()的線程有可能再進入到就緒態后被操作系統再次選中被執行。
- jion 方法:把指定線程加入當前線程,可以將兩個交替執行的線程合并為順序執行,比如再B中調用了線程A的join方法,直到線程A執行完畢后,才會執行線程B。