Java工程師知識(shí)樹(shù) / Java基礎(chǔ)
Thread類(lèi)的常用屬性
1.線程名稱(chēng)
給線程一個(gè)有意義的名稱(chēng)是一個(gè)好的做法调卑,便于問(wèn)題的排查與線程的跟蹤祟滴。
在構(gòu)造方法中沒(méi)有傳入自定義的名稱(chēng)的話蚕苇,線程會(huì)使用默認(rèn)命名。
默認(rèn)線程名稱(chēng)相關(guān)源代碼為:"Thread-" + nextThreadNum()
public Thread() {
init(null, null, "Thread-" + nextThreadNum(), 0);
}
---
/* For autonumbering anonymous threads. */
private static int threadInitNumber;
private static synchronized int nextThreadNum() {
return threadInitNumber++;
}
通過(guò) getName()獲取線程的名稱(chēng)云芦;通過(guò) setName(String name) 的?法來(lái)改掉線程的名字的。
代碼示例:
package com.thread.study;
public class ThreadParamter {
public static void main(String[] args) throws InterruptedException {
// 使用默認(rèn)賦值的線程名稱(chēng)
new Thread(() -> System.out.println(Thread.currentThread().getName() + "----啟動(dòng)啦")).start();
Thread.sleep(10);//主線程休息10ms
// 使用自定義的線程名稱(chēng)
Thread thread = new Thread(() -> System.out.println(Thread.currentThread().getName() + "----啟動(dòng)啦"),"測(cè)試線程小程");
System.out.println(thread.getName());
thread.start();
System.out.println(thread.getName());
thread.setName("測(cè)試線程小線");
System.out.println(thread.getName());
Thread.sleep(10);//主線程休息10ms
thread.setName("測(cè)試線程小線程");
System.out.println(thread.getName());
}
}
執(zhí)行結(jié)果:
Thread-0----啟動(dòng)啦
測(cè)試線程小程
測(cè)試線程小程
測(cè)試線程小線
測(cè)試線程小線----啟動(dòng)啦
測(cè)試線程小線程
2.守護(hù)線程
在Java中有兩類(lèi)線程:User Thread(用戶線程)贸桶、Daemon Thread(守護(hù)線程)舅逸。用戶線程(User Thread)是可以理解為運(yùn)行在前臺(tái)的線程。守護(hù)進(jìn)程(Daemon Thread)是運(yùn)行在后臺(tái)的一種特殊進(jìn)程皇筛。
Java平臺(tái)把操作系統(tǒng)的底層進(jìn)行了屏蔽琉历,在JVM虛擬平臺(tái)里面構(gòu)造出對(duì)自己有利的機(jī)制,這就是守護(hù)線程的由來(lái)。
守護(hù)線程作用:
守護(hù)線程經(jīng)常用作與執(zhí)行一些后臺(tái)任務(wù)旗笔,因此有時(shí)它也被稱(chēng)為后臺(tái)線程彪置,當(dāng)你希望關(guān)閉某些線程的時(shí)候,或者退出JVM進(jìn)程的時(shí)候蝇恶,一些線程能夠自動(dòng)關(guān)閉拳魁,此時(shí)就可以考慮用守護(hù)線程為你完成這樣的工作。
守護(hù)線程為其他線程的運(yùn)行提供便利服務(wù)撮弧,它獨(dú)立于控制終端并且周期性地執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件潘懊。
也就是說(shuō)守護(hù)線程不依賴(lài)于終端,但是依賴(lài)于系統(tǒng)想虎,與系統(tǒng)“同生共死” 卦尊,這也是守護(hù)線程的特點(diǎn)。
守護(hù)線程與用戶線程的關(guān)系:
當(dāng)所有的非守護(hù)線程(用戶線程)結(jié)束時(shí)舌厨,程序也就終止了岂却,同時(shí)會(huì)殺死進(jìn)程中的所有守護(hù)線程。反過(guò)來(lái)說(shuō)裙椭,只要任何非守護(hù)線程(用戶線程)還在運(yùn)行躏哩,程序就不會(huì)終止。
自定義守護(hù)線程:
守護(hù)線程并非只有虛擬機(jī)內(nèi)部提供揉燃,用戶在編寫(xiě)程序時(shí)也可以自己設(shè)置守護(hù)線程扫尺,自行設(shè)定的方法:
public final void setDaemon(boolean flag)
使用注意點(diǎn):
-
thread.setDaemon(true)
必須在thread.start()
之前設(shè)置,否則會(huì)跑出一個(gè)IllegalThreadStateException
異常炊汤。不能把正在運(yùn)行的常規(guī)線程設(shè)置為守護(hù)線程正驻。 - 在守護(hù)線程中產(chǎn)生的新線程也是守護(hù)線程的。
- 守護(hù)線程應(yīng)該永遠(yuǎn)不去訪問(wèn)固有資源抢腐,如文件姑曙、數(shù)據(jù)庫(kù),因?yàn)樗鼤?huì)在任何時(shí)候甚至在一個(gè)操作的中間發(fā)生中斷迈倍。
垃圾回收線程:
垃圾回收線程就是一個(gè)經(jīng)典的守護(hù)線程伤靠,當(dāng)我們的程序中不再有任何運(yùn)行的Thread,程序就不會(huì)再產(chǎn)生垃圾,垃圾回收器也就無(wú)事可做啼染,所以當(dāng)垃圾回收線程是JVM上僅剩的線程時(shí)宴合,垃圾回收線程會(huì)自動(dòng)離開(kāi)。它始終在低級(jí)別的狀態(tài)中運(yùn)行迹鹅,用于實(shí)時(shí)監(jiān)控和管理系統(tǒng)中的可回收資源卦洽。
3.線程優(yōu)先級(jí)
垃圾回收線程始終在低級(jí)別的狀態(tài)中運(yùn)行。這里的低級(jí)別狀態(tài)就是指的線程優(yōu)先級(jí)斜棚。
public final static int MIN_PRIORITY = 1;// 最小線程優(yōu)先級(jí)
public final static int NORM_PRIORITY = 5;// 默認(rèn)線程優(yōu)先級(jí)
public final static int MAX_PRIORITY = 10;// 最大線程優(yōu)先級(jí)
-----
public final void setPriority(int newPriority) //為線程設(shè)定優(yōu)先級(jí)
public final int getPriority() //獲取線程的優(yōu)先級(jí)
線程優(yōu)先級(jí)高僅僅表示線程獲取的CPU時(shí)間?的?率?逐样,但這不是?個(gè)確定的因素!使用線程的時(shí)候使用線程的默認(rèn)優(yōu)先級(jí)即可。
4.線程的狀態(tài)
在Thread內(nèi)部類(lèi)java.lang.Thread.State脂新。
5.線程的方法
Thread類(lèi)的public方法
Thread Thread.currentThread() :獲得當(dāng)前線程的引用挪捕。獲得當(dāng)前線程后對(duì)其進(jìn)行操作。與this是有區(qū)別的争便。
Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler() :返回線程由于未捕獲到異常而突然終止時(shí)調(diào)用的默認(rèn)處理程序级零。
int Thread.activeCount():當(dāng)前線程所在線程組中活動(dòng)線程的數(shù)目。
void dumpStack() :將當(dāng)前線程的堆棧跟蹤打印至標(biāo)準(zhǔn)錯(cuò)誤流滞乙。
int enumerate(Thread[] tarray) :將當(dāng)前線程的線程組及其子組中的每一個(gè)活動(dòng)線程復(fù)制到指定的數(shù)組中奏纪。
Map<Thread,StackTraceElement[]> getAllStackTraces() :返回所有活動(dòng)線程的堆棧跟蹤的一個(gè)映射。
boolean holdsLock(Object obj) :當(dāng)且僅當(dāng)當(dāng)前線程在指定的對(duì)象上保持監(jiān)視器鎖時(shí)斩启,才返回 true序调。
boolean interrupted() :測(cè)試當(dāng)前線程是否已經(jīng)中斷。
void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) :設(shè)置當(dāng)線程由于未捕獲到異常而突然終止兔簇,并且沒(méi)有為該線程定義其他處理程序時(shí)所調(diào)用的默認(rèn)處理程序发绢。
void sleep(long millis) :休眠指定時(shí)間
void sleep(long millis, int nanos) :休眠指定時(shí)間
void yield() :暫停當(dāng)前正在執(zhí)行的線程對(duì)象,并執(zhí)行其他線程垄琐。意義不太大
void checkAccess() :判定當(dāng)前運(yùn)行的線程是否有權(quán)修改該線程边酒。
ClassLoader getContextClassLoader() :返回該線程的上下文 ClassLoader。
long getId() :返回該線程的標(biāo)識(shí)符狸窘。
String getName() :返回該線程的名稱(chēng)墩朦。
int getPriority() :返回線程的優(yōu)先級(jí)。
StackTraceElement[] getStackTrace() :返回一個(gè)表示該線程堆棧轉(zhuǎn)儲(chǔ)的堆棧跟蹤元素?cái)?shù)組翻擒。
Thread.State getState() :返回該線程的狀態(tài)氓涣。
ThreadGroup getThreadGroup() :返回該線程所屬的線程組。
Thread.UncaughtExceptionHandler getUncaughtExceptionHandler() :返回該線程由于未捕獲到異常而突然終止時(shí)調(diào)用的處理程序陋气。
void interrupt() :中斷線程春哨。
boolean isAlive() :測(cè)試線程是否處于活動(dòng)狀態(tài)。
boolean isDaemon() :測(cè)試該線程是否為守護(hù)線程恩伺。
boolean isInterrupted():測(cè)試線程是否已經(jīng)中斷。
void join() :等待該線程終止椰拒。
void join(long millis) :等待該線程終止的時(shí)間最長(zhǎng)為 millis 毫秒晶渠。
void join(long millis, int nanos) :等待該線程終止的時(shí)間最長(zhǎng)為 millis 毫秒 + nanos 納秒。
void run() :線程啟動(dòng)后執(zhí)行的方法燃观。
void setContextClassLoader(ClassLoader cl) :設(shè)置該線程的上下文 ClassLoader褒脯。
void setDaemon(boolean on) :將該線程標(biāo)記為守護(hù)線程或用戶線程。
void start():使該線程開(kāi)始執(zhí)行缆毁;Java 虛擬機(jī)調(diào)用該線程的 run 方法番川。
String toString():返回該線程的字符串表示形式,包括線程名稱(chēng)、優(yōu)先級(jí)和線程組颁督。