Java基礎(chǔ)-線程-Thread類(lèi)

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)程皇筛。

image

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):

  1. thread.setDaemon(true)必須在thread.start()之前設(shè)置,否則會(huì)跑出一個(gè)IllegalThreadStateException異常炊汤。不能把正在運(yùn)行的常規(guī)線程設(shè)置為守護(hù)線程正驻。
  2. 守護(hù)線程中產(chǎn)生的新線程也是守護(hù)線程的。
  3. 守護(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í)和線程組颁督。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末践啄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子沉御,更是在濱河造成了極大的恐慌屿讽,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吠裆,死亡現(xiàn)場(chǎng)離奇詭異伐谈,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)试疙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)诵棵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人祝旷,你說(shuō)我怎么就攤上這事履澳。” “怎么了缓屠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵奇昙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我敌完,道長(zhǎng)储耐,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任滨溉,我火速辦了婚禮什湘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晦攒。我一直安慰自己闽撤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布脯颜。 她就那樣靜靜地躺著哟旗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪栋操。 梳的紋絲不亂的頭發(fā)上闸餐,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音矾芙,去河邊找鬼舍沙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛剔宪,可吹牛的內(nèi)容都是我干的拂铡。 我是一名探鬼主播壹无,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼感帅!你這毒婦竟也來(lái)了斗锭?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤留瞳,失蹤者是張志新(化名)和其女友劉穎拒迅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體她倘,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡璧微,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了硬梁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片前硫。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖荧止,靈堂內(nèi)的尸體忽然破棺而出屹电,到底是詐尸還是另有隱情,我是刑警寧澤跃巡,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布危号,位于F島的核電站,受9級(jí)特大地震影響素邪,放射性物質(zhì)發(fā)生泄漏外莲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一兔朦、第九天 我趴在偏房一處隱蔽的房頂上張望偷线。 院中可真熱鬧,春花似錦沽甥、人聲如沸声邦。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)亥曹。三九已至,卻和暖如春恨诱,著一層夾襖步出監(jiān)牢的瞬間媳瞪,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工胡野, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痕鳍。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓硫豆,卻偏偏與公主長(zhǎng)得像龙巨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子熊响,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容