线程信息的获取和设置
一、thread類(lèi)有一些保存信息的屬性,這些屬性可以用來(lái)標(biāo)識(shí)線程,顯示線程的狀態(tài)或者控制線程的優(yōu)先級(jí)。
1.ID:保存了線程的唯一標(biāo)識(shí)符
2.Name:保存了線程的名稱(chēng)
3.Priority:保存了線程對(duì)象的優(yōu)先級(jí)。線程的優(yōu)先級(jí)是從1到10,其中1是最低優(yōu)先級(jí),10是最高優(yōu)先級(jí)。
4.Status:保存了線程的狀態(tài)。線程的狀態(tài)有6種:new、runnable、blocked、waiting、time waiting或者terminated。
?
二、線程的中斷
1.Thread類(lèi)中的isInterrupted()方法
2.Thread類(lèi)的靜態(tài)方法interrupted()方法
isInterrupted()方法和interrupted()方法的區(qū)別是:isInterrupted()方法不能改變interrupted屬性的值,但是interrupted()方法能設(shè)置interrupted屬性為false。因?yàn)閕nterrupted()方法是一個(gè)靜態(tài)方法,更推薦使用isInterrupted()方法。
三、線程的休眠
線程休眠可以調(diào)用Thread類(lèi)的靜態(tài)方法sleep(long millis),該方法參數(shù)單位為毫秒。
另外一種方式是通過(guò)TimeUnit枚舉類(lèi)來(lái)使用Thread類(lèi)的sleep()方法,但是它接收的參數(shù)單位是秒,最終被轉(zhuǎn)為毫秒。
四、等待線程的終止
在一些情況下,我們必須等待線程終止后,在執(zhí)行其他任務(wù),這時(shí)候我們使用Thread類(lèi)的join()方法。
當(dāng)一個(gè)線程對(duì)象的join()方法被調(diào)用時(shí),調(diào)用它的線程將被掛起,直到這個(gè)線程對(duì)象完成它的任務(wù)。
java提供了另外兩種形式的join()方法:參數(shù)單位毫秒和納秒
join(long milliseconds)
join(long milliseconds,long nanos)
五、守護(hù)線程
守護(hù)線程的優(yōu)先級(jí)很低,通常來(lái)說(shuō),當(dāng)同一個(gè)應(yīng)用程序里沒(méi)有其他的線程運(yùn)行時(shí)候,守護(hù)線程才運(yùn)行。當(dāng)守護(hù)線程是程序中唯一運(yùn)行的線程時(shí),守護(hù)線程執(zhí)行結(jié)束后,JVM也就結(jié)束了這個(gè)程序。
Daemon的作用是為其他線程的運(yùn)行提供便利服務(wù),守護(hù)線程最典型的應(yīng)用就是 GC (垃圾回收器),它就是一個(gè)很稱(chēng)職的守護(hù)者。
User和Daemon兩者幾乎沒(méi)有區(qū)別,唯一的不同之處就在于虛擬機(jī)的離開(kāi):如果 User Thread已經(jīng)全部退出運(yùn)行了,只剩下Daemon Thread存在了,虛擬機(jī)也就退出了。 因?yàn)闆](méi)有了被守護(hù)者,Daemon也就沒(méi)有工作可做了,也就沒(méi)有繼續(xù)運(yùn)行程序的必要了。
值得一提的是,守護(hù)線程并非只有虛擬機(jī)內(nèi)部提供,用戶在編寫(xiě)程序時(shí)也可以自己設(shè)置守護(hù)線程。下面的方法就是用來(lái)設(shè)置守護(hù)線程的。
Thread daemonTread = new Thread(); ?
// 設(shè)定 daemonThread 為 守護(hù)線程,default false(非守護(hù)線程) ?
daemonThread.setDaemon(true); ?
// 驗(yàn)證當(dāng)前線程是否為守護(hù)線程,返回 true 則為守護(hù)線程 ?
daemonThread.isDaemon();? ?
setDaemon()方法只能在start()方法被調(diào)用之前設(shè)置。一旦線程開(kāi)始運(yùn)行,將不能再修改守護(hù)狀態(tài)。
isDaemon()方法被用來(lái)檢查一個(gè)線程是不是守護(hù)線程,返回值為true表示這個(gè)線程是守護(hù)線程,false表示這個(gè)線程是用戶線程。
六、線程局部變量的使用
ThreadLocal為每個(gè)使用該變量的線程分配一個(gè)獨(dú)立的變量副本。所以每一個(gè)線程都可以獨(dú)立地改變自己的副本,而不會(huì)影響其他線程所對(duì)應(yīng)的副本。
1、ThreadLocal不是線程,是線程的一個(gè)變量,你可以先簡(jiǎn)單理解為線程類(lèi)的屬性變量。
2、ThreadLocal在類(lèi)中通常定義為靜態(tài)變量。
3、每個(gè)線程有自己的一個(gè)ThreadLocal,它是變量的一個(gè)“拷貝”,修改它不影響其他線程。
ThreadLocal適用于資源共享但不需要維護(hù)狀態(tài)的情況,也就是一個(gè)線程對(duì)資源的修改,不影響另一個(gè)線程的運(yùn)行;這種設(shè)計(jì)是‘空間換時(shí)間’,synchronized順序執(zhí)行是‘時(shí)間換取空間’。
四個(gè)核心方法說(shuō)明如下:
T get():返回此線程局部變量的當(dāng)前線程副本中的值。
protected T initialValue():返回此線程局部變量的當(dāng)前線程的“初始值”。
void remove():移除此線程局部變量當(dāng)前線程的值。
void set(T value):將此線程局部變量的當(dāng)前線程副本中的值設(shè)置為指定值。
七、線程的分組
Java Concurrent API中提供了對(duì)線程進(jìn)行分組管理的ThreadGroup,使得我們可以將多個(gè)線程看作一個(gè)單元,對(duì)這些線程執(zhí)行操作,如中斷一組線程等。
ThreadGroup類(lèi)有很多方法,它的API文檔提供了所有的方法的完整解釋。
八、線程工廠類(lèi)
工廠模式是面向?qū)ο缶幊讨凶畛J褂玫哪J街?。它是一個(gè)創(chuàng)建者模式,使用一個(gè)類(lèi)為其他的一個(gè)或者多個(gè)類(lèi)創(chuàng)建對(duì)象。當(dāng)我們要為這些類(lèi)創(chuàng)建對(duì)象時(shí),不需再使用new構(gòu)造器,而使用工廠類(lèi)。
使用工廠類(lèi),可以將對(duì)象的創(chuàng)建集中化,這樣做有以下的好處:
1、更容易修改類(lèi),或者改變創(chuàng)建對(duì)象的方式;
2、更容易為有限資源限制創(chuàng)建對(duì)象的數(shù)目。例如,我們可以限制一個(gè)類(lèi)型的對(duì)象不多于n個(gè)。
3、更容易為創(chuàng)建的對(duì)象生成統(tǒng)計(jì)數(shù)據(jù)。
Java提供了ThreadFactory接口,這個(gè)接口實(shí)現(xiàn)了線程對(duì)象工廠。Java并發(fā)API的高級(jí)工具類(lèi)也使用了線程工廠創(chuàng)建線程。
?
轉(zhuǎn)載于:https://www.cnblogs.com/web424/p/7874202.html
總結(jié)
以上是生活随笔為你收集整理的线程信息的获取和设置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: cityofstars歌词是口语化的吗
- 下一篇: 封装构造函数,用canvas写饼状图和柱