java线程——中断线程+线程状态+线程属性(优先级)
【0】README
0.1) 本文描述轉自 core java volume 1, 源代碼為原創,旨在理解 java線程——中斷線程+線程狀態+線程屬性(優先級) 的相關知識;
【1】中斷線程
1.1)當線程的run方法執行方法體中最后一條語句后, 并經由return語句返回時, 或出現了在方法中沒有捕獲的異常時,線程將終止;
1.2)強制線程終止: interrupt 方法可以用來請求終止線程;
- 1.2.1)判斷線程是否已經終止: Thread.currentThread().isInterrupted()
- 1.2.2)但是,如果線程被阻塞, 就無法檢測中斷狀態,這是產生 InterruptedException異常的地方;
- 1.2.3)中斷狀態時的線程調用 sleep, 不僅不會休眠, 相反, 拋出IntertupptedException;
Annotation)有兩個非常類似的方法, interrupted 和 isInterrupted
- A1)Interrupted 方法是一個靜態方法: 它檢測當前的線程是否中斷, 而且,該方法會清除該線程的中斷狀態;
- A2)isInterrupted 方法是一個實例方法: 可用來檢驗是否有線程被中斷, 調用這個方法不會改變中斷狀態;
1.3)有兩種方法用來拋出 InterrupttedException
- 1.3.1)在catch 子句中調用 Thread.currentThread().interrrupt() 來設置中斷狀態;
- 1.3.2)或者用throws 標記你的方法, 不采用 try 語句塊捕獲這個異常
【2】線程狀態
2.1)線程有6種狀態(status):
- S1) new(新創建);
- S2) Runnable(可運行);
- S3) Blocked(被阻塞);
- S4) Waiting(等待);
- S5) Timed waiting(計時等待);
- S6) Terminated(被終止);
- Attention)記住, 在任何時刻,一個可運行線程可能正在運行也可能沒有運行(這就是為什么將這個狀態稱為 可運行而不是 運行);
【3】被阻塞線程和等待線程
3.1)阻塞狀態:當一個線程試圖獲取一個內部的對象鎖,而該鎖被其他線程持有, 則該線程進入阻塞狀態;
3.2)等待狀態:當線程等待另一個線程通知調度器一個條件時, 它進入等待狀態;(在調用 Object.wait 或 Thread.join 方法 或是等待java.util.concurrent 庫中的Lock 或 Condition時, 就會出現這種case);
3.3)超時參數:調用它們導致線程進入計時等待狀態, 這一狀態將一直保持到超時期滿或者接收到適當的通知, 方法有:Thread.sleep , Object.wait, Thread.join, Lock.tryLock ,Condition.await;
【4】被終止的線程
4.0)終止的原因(Reasons):
- R1)因為run方法正常退出而終止;
R2)因為一個沒有捕獲的異常終止了run方法而意外死亡;
M1)start方法:開啟線程(抑或是分配CPU), 它執行Runnable接口的 run 方法;
- M2)yield()方法的作用是:暫停當前正在執行的線程對象,并執行其他線程。;
- M3)Thread的非靜態方法join()方法:讓一個線程B“加入”到另外一個線程A的尾部。在A執行完畢之前,B不能工作。例如:
- M3.1)另外,join()方法還有帶超時限制的重載版本。 例如t.join(5000);則讓線程等待5000毫秒,如果超過這個時間,則停止等待,變為可運行狀態。
線程的加入join()對線程棧導致的結果是線程棧發生了變化,當然這些變化都是瞬時的。下面給示意圖
- M4)Thread.sleep方法: 使當前線程睡眠至少多少毫秒
- M5) void notify() : 喚醒在此對象監視器上等待的單個線程。
- M6) void notifyAll(): 喚醒在此對象監視器上等待的所有線程。
- M7) void wait() :導致當前的線程等待,直到其他線程調用此對象的 notify() 方法或 notifyAll() 方法。
- M8)synchronized : 同步方法或同步塊的關鍵字;
【5】線程屬性
5.1)線程優先級
- 5.1.1)設置線程的優先級:線程默認的優先級是創建它的執行線程的優先級。可以通過setPriority(int newPriority)更改線程的優先級。例如:
- 線程優先級為1~10之間的正整數,JVM從不會改變一個線程的優先級。
- 5.1.1.1)線程默認優先級是5,Thread類中有三個常量,定義線程優先級范圍:
- 5.1.1.2)static int MAX_PRIORITY :線程可以具有的最高優先級。
- 5.1.1.3)static int MIN_PRIORITY :線程可以具有的最低優先級。
- 5.1.1.4)static int NORM_PRIORITY :分配給線程的默認優先級 == 5。
5.2)守護線程
- 5.2.1)通過調用 t.setDaemon(true) 來將線程轉換為 守護線程(daemon thread);
- 5.2.2)守護線程的唯一用途: 為其他線程提供服務;
- 5.2.3)看個荔枝:計時線程就是一個荔枝。它定時發送“計時器滴答”信號給其他線程或清空過時的高速緩存項的線程。當只剩下守護線程時, 虛擬機就退出了,因為如果只有守護線程, 就沒必要繼續運行程序了;
5.3)未捕獲異常處理器
- 5.3.1)出現的問題: 線程的run方法不能拋出任何被檢測的異常, 但是,不被檢測的異常會導致線程死亡;
- 5.3.2)解決方法:在線程死亡之前, 異常被傳遞到一個用于未捕獲異常的處理器;
- 5.3.2.1)該處理器必須屬于一個實現了 Thread.UncaughtExceptionHandler 接口的類。 這個接口只有一個方法: void uncaughtExceptionHandler ;
- 5.3.2.2)可以用 setUncaughtExceptionHandler 方法為任何線程安裝一個 處理器。 也可以用 Thread的靜態方法 setDefaultUncaughtExceptionHandler 為所有線程安裝一個默認處理器;
- 5.3.2.3)如果不安裝默認的處理器, 默認處理器就為空。 但是,如果不為獨立的線程安裝處理器,此時的處理器就是該線程的 ThreadGroup 對象了;(但是建議,不要在程序中使用線程組 ThreadGroup);
總結
以上是生活随笔為你收集整理的java线程——中断线程+线程状态+线程属性(优先级)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 青烟袅袅的意思是什么 什么是青烟袅袅
- 下一篇: 笑看天下什么意思 笑看天下意思是什么