一、thread類有一些保存信息的屬性,這些屬性可以用來標識線程,顯示線程的狀態或者控制線程的優先級。
1.ID:保存了線程的唯一標識符
2.Name:保存了線程的名稱
3.Priority:保存了線程對象的優先級。線程的優先級是從1到10,其中1是最低優先級,10是最高優先級。
4.Status:保存了線程的狀態。線程的狀態有6種:new、runnable、blocked、waiting、time waiting或者terminated。
二、線程的中斷
1.Thread類中的isInterrupted()方法
2.Thread類的靜態方法interrupted()方法
isInterrupted()方法和interrupted()方法的區別是:isInterrupted()方法不能改變interrupted屬性的值,但是interrupted()方法能設置interrupted屬性為false。因為interrupted()方法是一個靜態方法,更推薦使用isInterrupted()方法。
三、線程的休眠
線程休眠可以調用Thread類的靜態方法sleep(long millis),該方法參數單位為毫秒。
另外一種方式是通過TimeUnit枚舉類來使用Thread類的sleep()方法,但是它接收的參數單位是秒,最終被轉為毫秒。
四、等待線程的終止
在一些情況下,我們必須等待線程終止后,在執行其他任務,這時候我們使用Thread類的join()方法。
當一個線程對象的join()方法被調用時,調用它的線程將被掛起,直到這個線程對象完成它的任務。
java提供了另外兩種形式的join()方法:參數單位毫秒和納秒
join(long milliseconds)
join(long milliseconds,long nanos)
五、守護線程
守護線程的優先級很低,通常來說,當同一個應用程序里沒有其他的線程運行時候,守護線程才運行。當守護線程是程序中唯一運行的線程時,守護線程執行結束后,JVM也就結束了這個程序。
Daemon的作用是為其他線程的運行提供便利服務,守護線程最典型的應用就是 GC (垃圾回收器),它就是一個很稱職的守護者。
User和Daemon兩者幾乎沒有區別,唯一的不同之處就在於虛擬機的離開:如果 User Thread已經全部退出運行了,只剩下Daemon Thread存在了,虛擬機也就退出了。 因為沒有了被守護者,Daemon也就沒有工作可做了,也就沒有繼續運行程序的必要了。
值得一提的是,守護線程並非只有虛擬機內部提供,用戶在編寫程序時也可以自己設置守護線程。下面的方法就是用來設置守護線程的。
Thread daemonTread = new Thread();
// 設定 daemonThread 為 守護線程,default false(非守護線程)
daemonThread.setDaemon(true);
// 驗證當前線程是否為守護線程,返回 true 則為守護線程
daemonThread.isDaemon();
setDaemon()方法只能在start()方法被調用之前設置。一旦線程開始運行,將不能再修改守護狀態。
isDaemon()方法被用來檢查一個線程是不是守護線程,返回值為true表示這個線程是守護線程,false表示這個線程是用戶線程。
六、線程局部變量的使用
ThreadLocal為每個使用該變量的線程分配一個獨立的變量副本。所以每一個線程都可以獨立地改變自己的副本,而不會影響其他線程所對應的副本。
1、ThreadLocal不是線程,是線程的一個變量,你可以先簡單理解為線程類的屬性變量。
2、ThreadLocal在類中通常定義為靜態變量。
3、每個線程有自己的一個ThreadLocal,它是變量的一個“拷貝”,修改它不影響其他線程。
ThreadLocal適用於資源共享但不需要維護狀態的情況,也就是一個線程對資源的修改,不影響另一個線程的運行;這種設計是‘空間換時間’,synchronized順序執行是‘時間換取空間’。
四個核心方法說明如下:
T get():返回此線程局部變量的當前線程副本中的值。
protected T initialValue():返回此線程局部變量的當前線程的“初始值”。
void remove():移除此線程局部變量當前線程的值。
void set(T value):將此線程局部變量的當前線程副本中的值設置為指定值。
七、線程的分組
Java Concurrent API中提供了對線程進行分組管理的ThreadGroup,使得我們可以將多個線程看作一個單元,對這些線程執行操作,如中斷一組線程等。
ThreadGroup類有很多方法,它的API文檔提供了所有的方法的完整解釋。
八、線程工廠類
工廠模式是面向對象編程中最常使用的模式之一。它是一個創建者模式,使用一個類為其他的一個或者多個類創建對象。當我們要為這些類創建對象時,不需再使用new構造器,而使用工廠類。
使用工廠類,可以將對象的創建集中化,這樣做有以下的好處:
1、更容易修改類,或者改變創建對象的方式;
2、更容易為有限資源限制創建對象的數目。例如,我們可以限制一個類型的對象不多於n個。
3、更容易為創建的對象生成統計數據。
Java提供了ThreadFactory接口,這個接口實現了線程對象工廠。Java並發API的高級工具類也使用了線程工廠創建線程。