日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

什么是線程組?你學(xué)會(huì)了嗎?

來(lái)源: 責(zé)編: 時(shí)間:2023-12-11 09:26:47 216觀看
導(dǎo)讀一、簡(jiǎn)介在之前的多線程系列文章中,我們陸陸續(xù)續(xù)的介紹了Thread線程類相關(guān)的知識(shí)和用法,其實(shí)在Thread類上還有一層ThreadGroup類,也就是線程組。今天我們就一起來(lái)簡(jiǎn)單的聊聊線程組相關(guān)的知識(shí)和用法。二、什么是線程組線

一、簡(jiǎn)介

在之前的多線程系列文章中,我們陸陸續(xù)續(xù)的介紹了Thread線程類相關(guān)的知識(shí)和用法,其實(shí)在Thread類上還有一層ThreadGroup類,也就是線程組。gNp28資訊網(wǎng)——每日最新資訊28at.com

今天我們就一起來(lái)簡(jiǎn)單的聊聊線程組相關(guān)的知識(shí)和用法。gNp28資訊網(wǎng)——每日最新資訊28at.com

二、什么是線程組

線程組,簡(jiǎn)單來(lái)說(shuō)就是多個(gè)線程的集合,它的出現(xiàn)主要是為了更方便的管理線程。gNp28資訊網(wǎng)——每日最新資訊28at.com

從結(jié)構(gòu)角度看,線程組與線程之間其實(shí)是一個(gè)父子結(jié)構(gòu),一個(gè)線程組可以擁有幾個(gè)線程,同時(shí)也可以擁有幾個(gè)線程組。整個(gè)組織結(jié)構(gòu)像一棵樹一樣,每個(gè)線程一定有一個(gè)線程組,線程組可能又有一個(gè)父線程組,追溯到根節(jié)點(diǎn)就是一個(gè)系統(tǒng)線程組。gNp28資訊網(wǎng)——每日最新資訊28at.com

線程組與線程之間的關(guān)系,可以用如下圖來(lái)描述。gNp28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片gNp28資訊網(wǎng)——每日最新資訊28at.com

比如,我們通常創(chuàng)建的main方法,對(duì)應(yīng)的是main線程,它所屬的是main線程組,main線程組的父級(jí)是是system系統(tǒng)線程組。gNp28資訊網(wǎng)——每日最新資訊28at.com

public static void main(String[] args) {    Thread currentThread = Thread.currentThread();    ThreadGroup currentThreadGroup = currentThread.getThreadGroup();    ThreadGroup systemThreadGroup = currentThreadGroup.getParent();    System.out.println("currentThread:" + currentThread.getName());    System.out.println("currentThreadGroup:" + currentThreadGroup.getName());    System.out.println("systemThreadGroup:" + systemThreadGroup.getName());}

輸出結(jié)果如下:gNp28資訊網(wǎng)——每日最新資訊28at.com

currentThread:maincurrentThreadGroup:mainsystemThreadGroup:system

其中system線程組就是根節(jié)點(diǎn),再上一層就沒(méi)有了,如果調(diào)用會(huì)拋空指針異常。gNp28資訊網(wǎng)——每日最新資訊28at.com

線程組最主要的作用是:可以實(shí)現(xiàn)批量管理線程或者線程組,有效的對(duì)線程或者線程組對(duì)象進(jìn)行檢查、嘗試中斷等操作。gNp28資訊網(wǎng)——每日最新資訊28at.com

下面我們就一起來(lái)看看ThreadGroup的常用方法和使用技巧。gNp28資訊網(wǎng)——每日最新資訊28at.com

三、線程組用法詳解

3.1、構(gòu)造方法介紹

ThreadGroup提供了兩個(gè)構(gòu)造方法,內(nèi)容如下:gNp28資訊網(wǎng)——每日最新資訊28at.com

方法gNp28資訊網(wǎng)——每日最新資訊28at.com

描述gNp28資訊網(wǎng)——每日最新資訊28at.com

ThreadGroup(String name)gNp28資訊網(wǎng)——每日最新資訊28at.com

根據(jù)線程組名稱創(chuàng)建線程組,其父線程組為main線程組gNp28資訊網(wǎng)——每日最新資訊28at.com

ThreadGroup(ThreadGroup parent, String name)gNp28資訊網(wǎng)——每日最新資訊28at.com

根據(jù)線程組名稱創(chuàng)建線程組,其父線程組為指定的 parent 線程組gNp28資訊網(wǎng)——每日最新資訊28at.com

其中支持指定父級(jí)線程組的方法,在實(shí)際的使用中比較常見(jiàn)。gNp28資訊網(wǎng)——每日最新資訊28at.com

下面,我們演示一下這兩個(gè)構(gòu)造函數(shù)的用法:gNp28資訊網(wǎng)——每日最新資訊28at.com

public static void main(String[] args) {    ThreadGroup subThreadGroup1 = new ThreadGroup("sub1");    ThreadGroup subThreadGroup2 = new ThreadGroup(subThreadGroup1, "sub2");    System.out.println("sub1 parent thread group name:" + subThreadGroup1.getParent().getName());    System.out.println("sub2 parent thread group name:" + subThreadGroup2.getParent().getName());}

輸出結(jié)果如下:gNp28資訊網(wǎng)——每日最新資訊28at.com

sub1 parent thread group name:mainsub2 parent thread group name:sub1

3.2、核心方法介紹

ThreadGroup提供了很多有用的方法,下面整理了一些方法的簡(jiǎn)要介紹,內(nèi)容如下:gNp28資訊網(wǎng)——每日最新資訊28at.com

方法gNp28資訊網(wǎng)——每日最新資訊28at.com

描述gNp28資訊網(wǎng)——每日最新資訊28at.com

public final String getName()gNp28資訊網(wǎng)——每日最新資訊28at.com

返回此線程組的名稱gNp28資訊網(wǎng)——每日最新資訊28at.com

public final ThreadGroup getParent()gNp28資訊網(wǎng)——每日最新資訊28at.com

返回此線程組的父級(jí)gNp28資訊網(wǎng)——每日最新資訊28at.com

public final boolean parentOf(ThreadGroup g)gNp28資訊網(wǎng)——每日最新資訊28at.com

測(cè)試此線程組是線程組參數(shù)還是其父級(jí)線程組之一gNp28資訊網(wǎng)——每日最新資訊28at.com

public int activeCount()gNp28資訊網(wǎng)——每日最新資訊28at.com

返回此線程組及其子組中活動(dòng)線程的數(shù)量的估計(jì)值,遞歸遍歷該線程組中所有的子組,此方法主要用于調(diào)試和監(jiān)視目的gNp28資訊網(wǎng)——每日最新資訊28at.com

public int activeGroupCount ()gNp28資訊網(wǎng)——每日最新資訊28at.com

返回此線程組及其子組中活動(dòng)組的數(shù)目的估計(jì)值。遞歸遍歷該線程組中的所有子群,此方法主要用于調(diào)試和監(jiān)視目的gNp28資訊網(wǎng)——每日最新資訊28at.com

public final void checkAccess()gNp28資訊網(wǎng)——每日最新資訊28at.com

確定當(dāng)前運(yùn)行的線程是否具有修改此線程組的權(quán)限gNp28資訊網(wǎng)——每日最新資訊28at.com

public int enumerate(Thread[] list)gNp28資訊網(wǎng)——每日最新資訊28at.com

將這個(gè)線程組復(fù)制到它所在的組及其子組中gNp28資訊網(wǎng)——每日最新資訊28at.com

public final void destroy()gNp28資訊網(wǎng)——每日最新資訊28at.com

銷毀此線程組及其所有子組,當(dāng)線程組還要子線程或者子線程組,會(huì)拋異常gNp28資訊網(wǎng)——每日最新資訊28at.com

public boolean isDestroyed()gNp28資訊網(wǎng)——每日最新資訊28at.com

測(cè)試此線程組是否已被銷毀gNp28資訊網(wǎng)——每日最新資訊28at.com

public final int getMaxPriority()gNp28資訊網(wǎng)——每日最新資訊28at.com

返回此線程組的最大優(yōu)先級(jí)gNp28資訊網(wǎng)——每日最新資訊28at.com

public final void setMaxPriority(int pri)gNp28資訊網(wǎng)——每日最新資訊28at.com

設(shè)置組的最大優(yōu)先級(jí)。線程組中具有較高優(yōu)先級(jí)的線程不會(huì)受到影響gNp28資訊網(wǎng)——每日最新資訊28at.com

public final boolean isDaemon()gNp28資訊網(wǎng)——每日最新資訊28at.com

測(cè)試此線程組是否是守護(hù)線程組gNp28資訊網(wǎng)——每日最新資訊28at.com

public final void setDaemon(boolean daemon)gNp28資訊網(wǎng)——每日最新資訊28at.com

修改此線程組的守護(hù)進(jìn)程狀態(tài)gNp28資訊網(wǎng)——每日最新資訊28at.com

public final void interrupt()gNp28資訊網(wǎng)——每日最新資訊28at.com

嘗試中斷此線程組中的所有線程gNp28資訊網(wǎng)——每日最新資訊28at.com

public void list()gNp28資訊網(wǎng)——每日最新資訊28at.com

將此線程組的信息打印到標(biāo)準(zhǔn)輸出。此方法僅用于調(diào)試gNp28資訊網(wǎng)——每日最新資訊28at.com

下面我們抽取幾個(gè)比較常見(jiàn)的方法,進(jìn)行演示介紹。gNp28資訊網(wǎng)——每日最新資訊28at.com

3.2.1、activeCount 方法

activeCount()方法用于返回此線程組及其子組中活動(dòng)線程的數(shù)量的估計(jì)值,因?yàn)榫€程的數(shù)量是動(dòng)態(tài)發(fā)生變化的,返回的值只是一個(gè)估計(jì)值。gNp28資訊網(wǎng)——每日最新資訊28at.com

我們看一個(gè)簡(jiǎn)單的例子就知道了。gNp28資訊網(wǎng)——每日最新資訊28at.com

public class MyThread extends Thread{    public MyThread(ThreadGroup group, String name) {        super(group, name);    }    @Override    public void run() {        try {            Thread.sleep(500);        } catch (InterruptedException e) {            e.printStackTrace();        }    }}
public class MyThreadMainTest {    public static void main(String[] args) throws Exception {        ThreadGroup tg = new ThreadGroup("group1");        MyThread t1 = new MyThread (tg, "t1");        MyThread t2 = new MyThread (tg, "t2");        t1.start();        t2.start();        System.out.println("線程組的名稱:" +  tg.getName() + ",活動(dòng)的線程數(shù):" +  tg.activeCount());        Thread.sleep(1000);        System.out.println("線程組的名稱:" +  tg.getName() + ",活動(dòng)的線程數(shù):" +  tg.activeCount());    }}

輸出結(jié)果如下:gNp28資訊網(wǎng)——每日最新資訊28at.com

線程組的名稱:group1,活動(dòng)的線程數(shù):2線程組的名稱:group1,活動(dòng)的線程數(shù):0

第一次檢查線程都處于運(yùn)行狀態(tài),因此活動(dòng)的線程數(shù)為 2;過(guò) 1 秒之后,線程運(yùn)行結(jié)束,活動(dòng)的線程數(shù)為 0。gNp28資訊網(wǎng)——每日最新資訊28at.com

3.2.2、isDaemon 方法

setDaemon()方法用于測(cè)試此線程組是否是守護(hù)線程組。gNp28資訊網(wǎng)——每日最新資訊28at.com

需要注意的是:后臺(tái)線程組和后臺(tái)線程是兩個(gè)概念,后臺(tái)線程組的特性是最后一個(gè)線程執(zhí)行完或最后一個(gè)線程被銷毀時(shí),后臺(tái)線程組自動(dòng)銷毀,線程組只是為了統(tǒng)一管理線程的一個(gè)方式,跟后臺(tái)線程有區(qū)別!gNp28資訊網(wǎng)——每日最新資訊28at.com

例子如下:gNp28資訊網(wǎng)——每日最新資訊28at.com

public class MyThread extends Thread{    public MyThread(ThreadGroup group, String name) {        super(group, name);    }    @Override    public void run() {        System.out.println("當(dāng)前線程:" + Thread.currentThread().getName() + ",是否后臺(tái)線程:" +  Thread.currentThread().isDaemon());        System.out.println("當(dāng)前線程組:" + Thread.currentThread().getThreadGroup().getName() + ",是否后臺(tái)線程組:" +  Thread.currentThread().getThreadGroup().isDaemon());    }}
public class MyThreadMainTest4 {    public static void main(String[] args) throws Exception {        ThreadGroup mainGroup = Thread.currentThread().getThreadGroup();        new MyThread(mainGroup, "t1").start();        Thread.sleep(100);        // 設(shè)置守護(hù)線程組        ThreadGroup tg = new ThreadGroup("group1");        tg.setDaemon(true);        new MyThread(tg,"t2").start();    }}

輸出結(jié)果如下:gNp28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)前線程:t1,是否后臺(tái)線程:false當(dāng)前線程組:main,是否后臺(tái)線程組:false當(dāng)前線程:t2,是否后臺(tái)線程:false當(dāng)前線程組:group1,是否后臺(tái)線程組:true
3.2.3、interrupt 方法

interrupt()方法用于嘗試中斷此線程組中的所有線程。如果正在運(yùn)行的線程沒(méi)有進(jìn)入阻塞,是無(wú)法中斷的。gNp28資訊網(wǎng)——每日最新資訊28at.com

例子如下:gNp28資訊網(wǎng)——每日最新資訊28at.com

public class MyThreadA extends Thread{    public MyThreadA(ThreadGroup group, String name) {        super(group, name);    }    @Override    public void run() {        System.out.println("線程:" + Thread.currentThread().getName() + ",開始運(yùn)行");        String t;        for (int i = 0; i < 1000000000; i++) {            t = i + "";        }        System.out.println("線程:" + Thread.currentThread().getName() + ",停止運(yùn)行");    }}
public class MyThreadB extends Thread{    public MyThreadB(ThreadGroup group, String name) {        super(group, name);    }    @Override    public void run() {        System.out.println("線程:" + Thread.currentThread().getName() + ",開始運(yùn)行");        while (!Thread.interrupted()){        }        System.out.println("線程:" + Thread.currentThread().getName() + ",停止運(yùn)行");    }}
public class MyThreadC extends Thread{    public MyThreadC(ThreadGroup group, String name) {        super(group, name);    }    @Override    public void run() {        System.out.println("線程:" + Thread.currentThread().getName() + ",開始運(yùn)行");        try {            Thread.sleep(1000);        } catch (Exception e){//            e.printStackTrace();        }        System.out.println("線程:" + Thread.currentThread().getName() + ",停止運(yùn)行");    }}
public class MyThreadMainTest {    public static void main(String[] args) throws Exception {        ThreadGroup tg = new ThreadGroup("group1");        new MyThreadA(tg,"t1").start();        new MyThreadB(tg,"t2").start();        new MyThreadC(tg,"t3").start();        // 嘗試中斷線程組里面的線程        tg.interrupt();    }}

輸出結(jié)果如下:gNp28資訊網(wǎng)——每日最新資訊28at.com

線程:t1,開始運(yùn)行線程:t2,開始運(yùn)行線程:t2,停止運(yùn)行線程:t3,開始運(yùn)行線程:t3,停止運(yùn)行

線程t1只有等它運(yùn)行結(jié)束,通過(guò)interrupt()不能中斷程序!gNp28資訊網(wǎng)——每日最新資訊28at.com

四、小結(jié)

本文主要圍繞線程組的一些基本概念以及常用方法,并結(jié)合了一些簡(jiǎn)單示例進(jìn)行介紹。gNp28資訊網(wǎng)——每日最新資訊28at.com

線程組的出現(xiàn)更多的是便于有組織的管理線程,比如 Java 的線程池就用到了線程組,更多的線程知識(shí),我們?cè)诤罄m(xù)的文章中會(huì)進(jìn)行介紹。gNp28資訊網(wǎng)——每日最新資訊28at.com

如果有描述不對(duì)的地方,歡迎網(wǎng)友留言指出。gNp28資訊網(wǎng)——每日最新資訊28at.com

五、參考

1、https://www.cnblogs.com/xrq730/p/4856072.htmlgNp28資訊網(wǎng)——每日最新資訊28at.com

2、https://cloud.tencent.com/developer/article/1633465gNp28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-41695-0.html什么是線程組?你學(xué)會(huì)了嗎?

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: Go未來(lái)演進(jìn):基于共同目標(biāo)和數(shù)據(jù)驅(qū)動(dòng)的決策

下一篇: 利用Apache Kafka、Flink和Druid構(gòu)建實(shí)時(shí)數(shù)據(jù)架構(gòu)

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 轎車從天而降電動(dòng)車主被撞身亡 超速搶道所致:現(xiàn)場(chǎng)視頻讓網(wǎng)友吵翻

    近日,上海青浦區(qū)法院判決轎車從天而降電動(dòng)車主被撞身亡案,轎車車主被判有期徒刑一年。案件顯示當(dāng)時(shí)男子駕駛轎車在上海某路段行駛,前車忽然轉(zhuǎn)彎提速超車,
  • 28個(gè)SpringBoot項(xiàng)目中常用注解,日常開發(fā)、求職面試不再懵圈

    前言在使用SpringBoot開發(fā)中或者在求職面試中都會(huì)使用到很多注解或者問(wèn)到注解相關(guān)的知識(shí)。本文主要對(duì)一些常用的注解進(jìn)行了總結(jié),同時(shí)也會(huì)舉出具體例子,供大家學(xué)習(xí)和參考。注解
  • 線程通訊的三種方法!通俗易懂

    線程通信是指多個(gè)線程之間通過(guò)某種機(jī)制進(jìn)行協(xié)調(diào)和交互,例如,線程等待和通知機(jī)制就是線程通訊的主要手段之一。 在 Java 中,線程等待和通知的實(shí)現(xiàn)手段有以下幾種方式:Object 類下
  • 2023 年的 Node.js 生態(tài)系統(tǒng)

    隨著技術(shù)的不斷演進(jìn)和創(chuàng)新,Node.js 在 2023 年達(dá)到了一個(gè)新的高度。Node.js 擁有一個(gè)龐大的生態(tài)系統(tǒng),可以幫助開發(fā)人員更快地實(shí)現(xiàn)復(fù)雜的應(yīng)用。本文就來(lái)看看 Node.js 最新的生
  • 把LangChain跑起來(lái)的三個(gè)方法

    使用LangChain開發(fā)LLM應(yīng)用時(shí),需要機(jī)器進(jìn)行GLM部署,好多同學(xué)第一步就被勸退了,那么如何繞過(guò)這個(gè)步驟先學(xué)習(xí)LLM模型的應(yīng)用,對(duì)Langchain進(jìn)行快速上手?本片講解3個(gè)把LangChain跑起來(lái)
  • 騰訊蓋樓,字節(jié)拆墻

    來(lái)源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之&ldquo;想重溫暴刷深淵、30+技能搭配暴搓到爽的游戲體驗(yàn)嗎?一起上晶核,即刻暴打!&rdquo;曾憑借直播騰訊旗下代理格斗游戲《DNF》一
  • 華為HarmonyOS 4升級(jí)計(jì)劃公布:首批34款機(jī)型今日開啟公測(cè)

    8月4日消息,今天下午華為正式發(fā)布了HarmonyOS 4系統(tǒng),在更流暢的前提下,還帶來(lái)了不少新功能,UI設(shè)計(jì)也有變化,會(huì)讓手機(jī)煥然一新。華為宣布,首批機(jī)型將會(huì)在
  • 首發(fā)天璣9200+ iQOO Neo8系列發(fā)布首銷售價(jià)2299元起

    2023年5月23日晚,iQOO Neo8系列正式發(fā)布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro強(qiáng)悍登場(chǎng),限時(shí)售價(jià)3099元起;價(jià)位段最強(qiáng)性能手機(jī)iQOO Neo8同期上市
  • 蘋果140W USB-C充電器:采用氮化鎵技術(shù)

    據(jù)10 月 30 日 9to5 Mac 消息報(bào)道,當(dāng)蘋果推出新的 MacBook Pro 2021 時(shí),該公司還推出了新的 140W USB-C 充電器,附贈(zèng)在 MacBook Pro 16 英寸機(jī)型的盒子里,也支
Top 主站蜘蛛池模板: 林芝县| 古蔺县| 克什克腾旗| 通道| 崇信县| 墨江| 安徽省| 惠东县| 鹤峰县| 闻喜县| 藁城市| 长垣县| 朔州市| 饶平县| 普定县| 茌平县| 聂荣县| 新郑市| 莱西市| 襄城县| 沅江市| 林周县| 赞皇县| 阿瓦提县| 贡嘎县| 敦煌市| 大渡口区| 潞西市| 清新县| 枣强县| 万荣县| 芒康县| 闵行区| 枣庄市| 屏边| 平和县| 玉田县| 萍乡市| 延安市| 平顶山市| 嵩明县|