日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

010-ThreadGroup线程组

發(fā)布時(shí)間:2025/3/21 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 010-ThreadGroup线程组 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  線程組ThreadGroup表示一組線程的集合,一旦一個(gè)線程歸屬到一個(gè)線程組之中后,就不能再更換其所在的線程組。那么為什么要使用線程組呢?個(gè)人認(rèn)為有以下的好處:方便統(tǒng)一管理,線程組可以進(jìn)行復(fù)制,快速定位到一個(gè)線程,統(tǒng)一進(jìn)行異常設(shè)置等。ThreadGroup它其實(shí)并不屬于Java并發(fā)包中的內(nèi)容,它是java.lang中的內(nèi)容。但是掌握對其的于理解,在實(shí)際應(yīng)用中有很大的幫助。

一、基本方法

1、獲取當(dāng)前線程組名

Thread.currentThread().getThreadGroup().getName()

2、將線程放入到一個(gè)線程組中去

ThreadGroup threadGroup1 = new ThreadGroup("group1");
ThreadGroup threadGroup2 = new ThreadGroup("group2");
Thread thread1 =new Thread(threadGroup1, "group1's member");
Thread thread2 =new Thread(threadGroup2, "group2's member");

其中Thread中和ThreadGroup相關(guān)的構(gòu)造函數(shù):

public Thread(ThreadGroup group, Runnable target) {init(group, target, "Thread-" + nextThreadNum(), 0);}public Thread(ThreadGroup group, String name) {init(group, null, name, 0);}public Thread(ThreadGroup group, Runnable target, String name) {init(group, target, name, 0);}public Thread(ThreadGroup group, Runnable target, String name,long stackSize) {init(group, target, name, stackSize);} View Code

它們最終都是調(diào)用同一個(gè)函數(shù):

private void init(ThreadGroup g, Runnable target, String name,long stackSize) {Thread parent = currentThread();SecurityManager security = System.getSecurityManager();if (g == null) {//安全檢查if (security != null) {g = security.getThreadGroup();}//設(shè)置線程組if (g == null) {g = parent.getThreadGroup();}}//檢查可達(dá)性 g.checkAccess();//是否有權(quán)限訪問if (security != null) {if (isCCLOverridden(getClass())) {security.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);}}//往線程組添加線程但未啟動(dòng) g.addUnstarted();this.group = g;this.daemon = parent.isDaemon();//是否守護(hù)線程this.priority = parent.getPriority();//優(yōu)先級(jí)this.name = name.toCharArray();if (security == null || isCCLOverridden(parent.getClass()))this.contextClassLoader = parent.getContextClassLoader();elsethis.contextClassLoader = parent.contextClassLoader;this.inheritedAccessControlContext = AccessController.getContext();this.target = target;setPriority(priority);if (parent.inheritableThreadLocals != null)this.inheritableThreadLocals =ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);this.stackSize = stackSize;tid = nextThreadID();this.me = this;} View Code

3、復(fù)制線程組:

//這樣可以復(fù)制group里面的thread信息 Thread[] threads = new Thread[threadGroup.activeCount()]; threadGroup.enumerate(threads);

這里的activeCount很明顯就是取得活動(dòng)的線程,注意。默認(rèn)情況 下,連同其子線程組也會(huì)進(jìn)行復(fù)制。

4、未捕獲異常處理
ThreadGroup中有一個(gè)uncaughtException()方法。當(dāng)線程組中某個(gè)線程發(fā)生Unchecked exception異常時(shí),由執(zhí)行環(huán)境調(diào)用此方法進(jìn)行相關(guān)處理,如果有必要,可以重新定義此方法

二、應(yīng)用實(shí)例

1、基礎(chǔ)示例

package com.lhx.common.thread;import java.util.Date; import java.util.Random; import java.util.concurrent.TimeUnit;class Result {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}public class SearchTask implements Runnable {public SearchTask(Result result) {this.result = result;}private Result result;@Overridepublic void run() {String name = Thread.currentThread().getName();System.out.println("Thread Start " + name);try {doTask();result.setName(name);} catch (InterruptedException e) {System.out.printf("Thread %s: Interrupted\n", name);return;}System.out.printf("%s :Thread end %s\n" ,new Date(),name);}private void doTask() throws InterruptedException {Random random = new Random((new Date()).getTime());int value = (int) (random.nextDouble() * 100);System.out.printf("%s :Thread %s: %d\n",new Date(), Thread.currentThread().getName(),value);TimeUnit.SECONDS.sleep(value);}public static void main(String[] args) {System.out.println("main thread start:");//創(chuàng)建5個(gè)線程,并入group里面進(jìn)行管理ThreadGroup threadGroup = new ThreadGroup("Searcher");Result result = new Result();SearchTask searchTask = new SearchTask(result);for (int i = 0; i < 5; i++) {Thread thred = new Thread(threadGroup, searchTask);thred.start();try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}//通過這種方法可以看group里面的所有信息System.out.printf("Number of Threads: %d\n", threadGroup.activeCount());System.out.printf("Information about the Thread Group\n");threadGroup.list();//這樣可以復(fù)制group里面的thread信息Thread[] threads = new Thread[threadGroup.activeCount()];threadGroup.enumerate(threads);for (int i = 0; i < threadGroup.activeCount(); i++) {System.out.printf("%s:Thread %s: %s\n",new Date(), threads[i].getName(),threads[i].getState());}waitFinish(threadGroup);//將group里面的所有線程都給interpet threadGroup.interrupt();System.out.println("main thread end:");}private static void waitFinish(ThreadGroup threadGroup) {while (threadGroup.activeCount() > 0) {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}}} View Code

輸出:

main thread start: Thread Start Thread-0 Thu Sep 28 21:45:32 CST 2017 :Thread Thread-0: 42 Thread Start Thread-1 Thu Sep 28 21:45:33 CST 2017 :Thread Thread-1: 31 Thread Start Thread-2 Thu Sep 28 21:45:34 CST 2017 :Thread Thread-2: 12 Thread Start Thread-3 Thu Sep 28 21:45:35 CST 2017 :Thread Thread-3: 3 Thread Start Thread-4 Thu Sep 28 21:45:36 CST 2017 :Thread Thread-4: 30 Number of Threads: 5 Information about the Thread Group java.lang.ThreadGroup[name=Searcher,maxpri=10]Thread[Thread-0,5,Searcher]Thread[Thread-1,5,Searcher]Thread[Thread-2,5,Searcher]Thread[Thread-3,5,Searcher]Thread[Thread-4,5,Searcher] Thu Sep 28 21:45:37 CST 2017:Thread Thread-0: TIMED_WAITING Thu Sep 28 21:45:37 CST 2017:Thread Thread-1: TIMED_WAITING Thu Sep 28 21:45:37 CST 2017:Thread Thread-2: TIMED_WAITING Thu Sep 28 21:45:37 CST 2017:Thread Thread-3: TIMED_WAITING Thu Sep 28 21:45:37 CST 2017:Thread Thread-4: TIMED_WAITING Thu Sep 28 21:45:38 CST 2017 :Thread end Thread-3 Thu Sep 28 21:45:46 CST 2017 :Thread end Thread-2 Thu Sep 28 21:46:04 CST 2017 :Thread end Thread-1 Thu Sep 28 21:46:06 CST 2017 :Thread end Thread-4 Thu Sep 28 21:46:14 CST 2017 :Thread end Thread-0 main thread end:

2、統(tǒng)一異常處理實(shí)例

package com.lhx.common.thread;public class ThreadGroupException {public static void main(String[] args) {ThreadGroup threadGroup1 =// 這是匿名類寫法new ThreadGroup("group1") {// 繼承ThreadGroup并重新定義以下方法// 在線程成員拋出unchecked exception// 會(huì)執(zhí)行此方法public void uncaughtException(Thread t, Throwable e) {System.out.println(t.getName() + ": " + e.getMessage());}};// 這是匿名類寫法Thread thread1 =// 這個(gè)線程是threadGroup1的一員new Thread(threadGroup1, new Runnable() {public void run() {// 拋出unchecked異常throw new RuntimeException("測試異常");}});thread1.start();} } View Code

輸出

Thread-0: 測試異常

三、源碼解讀

1、首先看其包含的變量

public class ThreadGroup implements Thread.UncaughtExceptionHandler { private final ThreadGroup parent;//父親ThreadGroup String name;//ThreadGroup 的名稱 int maxPriority;//線程最大優(yōu)先級(jí) boolean destroyed;//是否被銷毀 boolean daemon;//是否守護(hù)線程 boolean vmAllowSuspension;//是否可以中斷 int nUnstartedThreads = 0;//還未啟動(dòng)的線程 int nthreads;//ThreadGroup中線程數(shù)目 Thread threads[];//ThreadGroup中的線程 int ngroups;//線程組數(shù)目 ThreadGroup groups[];//線程組數(shù)組

說明:

(1)線程組也可以包含其他線程組。如上面的groups[].
(2)線程組構(gòu)成一棵樹,在樹中,除了初始線程組外,每個(gè)線程組都有一個(gè)父線程組

2、構(gòu)造函數(shù)

//私有構(gòu)造函數(shù) private ThreadGroup() { this.name = "system"; this.maxPriority = Thread.MAX_PRIORITY; this.parent = null; } //默認(rèn)是以當(dāng)前ThreadGroup傳入作為parent ThreadGroup,新線程組的父線程組是目前正在運(yùn)行線程的線程組。 public ThreadGroup(String name) { this(Thread.currentThread().getThreadGroup(), name); } //構(gòu)造函數(shù) public ThreadGroup(ThreadGroup parent, String name) { this(checkParentAccess(parent), parent, name); } //私有構(gòu)造函數(shù) private ThreadGroup(Void unused, ThreadGroup parent, String name) { this.name = name; this.maxPriority = parent.maxPriority; this.daemon = parent.daemon; this.vmAllowSuspension = parent.vmAllowSuspension; this.parent = parent; parent.add(this); }

其終的調(diào)用構(gòu)造函數(shù)只有一個(gè),父線程組的 checkAccess 方法在checkParentAccess中會(huì)調(diào)用:

//檢查parent ThreadGroup private static void checkParentAccess(ThreadGroup parent) { parent.checkAccess(); return null; }

未捕獲異常設(shè)置:

public void uncaughtException(Thread t, Throwable e) {if (parent != null) {parent.uncaughtException(t, e);//父線程組不為空,設(shè)置到父線程組 } else {Thread.UncaughtExceptionHandler ueh = Thread.getDefaultUncaughtExceptionHandler();if (ueh != null) {ueh.uncaughtException(t, e);} else if (!(e instanceof ThreadDeath)) {System.err.print("Exception in thread \"" + t.getName() + "\" ");e.printStackTrace(System.err);}}}

如果父線程組存在, 則調(diào)用它的uncaughtException方法.
如果父線程組不存在, 但指定了默認(rèn)處理器 (下節(jié)中的As the default handler for the application), 則調(diào)用默認(rèn)的處理器
如果默認(rèn)處理器沒有設(shè)置, 則寫錯(cuò)誤日志.但如果 exception是ThreadDeath實(shí)例的話, 忽略

3、線程組復(fù)制:

//此線程組及其子組中的所有活動(dòng)線程復(fù)制到指定數(shù)組中。 public int enumerate(ThreadGroup list[]) {checkAccess();return enumerate(list, 0, true);}//此線程組及其子組中的所有活動(dòng)線程復(fù)制到指定數(shù)組中。 public int enumerate(ThreadGroup list[], boolean recurse) {checkAccess();return enumerate(list, 0, recurse);}//此線程組中的所有活動(dòng)線程復(fù)制到指定數(shù)組中。如果 recurse 標(biāo)志為 true,則還包括對此線程的子組中的所有活動(dòng)線程的引用。如果數(shù)組太小而無法保持所有線程,則 // 忽略額外的線程。 private int enumerate(ThreadGroup list[], int n, boolean recurse) {int ngroupsSnapshot = 0;ThreadGroup[] groupsSnapshot = null;synchronized (this) {if (destroyed) {return 0;}int ng = ngroups;if (ng > list.length - n) {//防止list放不下線程數(shù)目 ng = list.length - n;}if (ng > 0) {System.arraycopy(groups, 0, list, n, ng);//復(fù)制線程組 n += ng;}if (recurse) { //取得其子組 ngroupsSnapshot = ngroups;if (groups != null) {groupsSnapshot = Arrays.copyOf(groups, ngroupsSnapshot);} else {groupsSnapshot = null;}}}if (recurse) {//復(fù)制子組 for (int i = 0; i < ngroupsSnapshot; i++) {n = groupsSnapshot[i].enumerate(list, n, true);}}return n;} View Code

4、其他方法

int activeCount():獲取線程組中活動(dòng)線程的數(shù)量
interrupt():中斷線程組中所有線程
isDaemon():是否為后臺(tái)線程組
setDaemon(boolean daemon):設(shè)置為后臺(tái)線程組
setMaxPriority(int pri):設(shè)置線程組的最高優(yōu)先級(jí)

四、線程池和線程組區(qū)別

線程組:

  1.線程組管理線程,設(shè)置優(yōu)先級(jí),等屬性,安全控制。
  2.線程組必須從屬于其他線程組,默認(rèn)是系統(tǒng)主線程組。
  3.將線程加入到線程組需要先創(chuàng)建線程組對象,將其作為線程構(gòu)造函數(shù)參數(shù)。
  4.List()輸出線程樹,enumerate()復(fù)制線程組中所有線程到一個(gè)線程數(shù)組中

  線程組存在的意義,首要原因是安全。java默認(rèn)創(chuàng)建的線程都是屬于系統(tǒng)線程組,而同一個(gè)線程組的線程是可以相互修改對方的數(shù)據(jù)的。但如果在不同的線程組中,那么就不能“跨線程組”修改數(shù)據(jù),可以從一定程度上保證數(shù)據(jù)安全。

線程池:是為了管理線程的生命周期,復(fù)用線程,減少創(chuàng)建銷毀線程的開銷。

  線程池存在的意義,首要作用是效率。
  線程的創(chuàng)建和結(jié)束都需要耗費(fèi)一定的系統(tǒng)時(shí)間(特別是創(chuàng)建),不停創(chuàng)建和刪除線程會(huì)浪費(fèi)大量的時(shí)間。所以,在創(chuàng)建出一條線程并使其在執(zhí)行完任務(wù)后不結(jié)束,而是使其進(jìn)入休眠狀態(tài),在需要用時(shí)再喚醒,那么 就可以節(jié)省一定的時(shí)間。
  如果這樣的線程比較多,那么就可以使用線程池來進(jìn)行管理。保證效率。

  一般情況下,線程越多占用內(nèi)存也越大,并發(fā)量也越大。

線程組和線程池共有的特點(diǎn):
  1,都是管理一定數(shù)量的線程
  2,都可以對線程進(jìn)行控制---包括休眠,喚醒,結(jié)束,創(chuàng)建,中斷(暫停)--但并不一定包含全部這些操作。

?

總結(jié)

以上是生活随笔為你收集整理的010-ThreadGroup线程组的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天堂网成人 | 美女黄色av | 国产精品亚洲欧美在线播放 | 欧美一二三区在线观看 | 自拍视频在线播放 | 欧美调教视频 | 91国自啪| 91麻豆视频在线观看 | 欧洲亚洲一区二区三区 | 手机看片福利一区 | 国产精品自拍99 | 天天插天天爽 | 性色欲网站人妻丰满中文久久不卡 | 亚洲四虎av | 午夜久久一区 | 天天看片天天干 | 日本激情网址 | 成人高清在线 | 亚洲欧美日韩一区二区三区四区 | 手机在线免费av | av网址导航| 国产欧美日韩精品在线观看 | 亚洲成av人片在www色猫咪 | av在线免费观看网址 | 国产精品久久久久影院 | 国产又粗又猛又爽又黄av | 亚洲二区一区 | 亚洲 激情 小说 另类 欧美 | 欧美性猛交久久久久 | 久久911| 男人操女人网站 | 亚洲乱码国产乱码精品精的特点 | 国产精品久久久久久免费观看 | 伊人影音 | 亚洲AV第二区国产精品 | 欧美又大又硬又粗bbbbb | 日韩一区二区三区三四区视频在线观看 | 一道本av在线| 国产小视频你懂的 | 韩国伦理片在线播放 | 91精品毛片 | 亚洲视频在线免费看 | 日韩人妻一区二区三区 | 亚洲第四页 | 欧美一级黄色片视频 | 黄色av一级 | 肉视频在线观看 | 久国久产久精永久网页 | 肥熟女一区二区三肥熟女 | 久久久观看 | 日韩一区二区免费视频 | 欧洲一区二区在线观看 | 精品国偷自产国产一区 | av在线资源网 | 日韩av在线观看免费 | 夜夜嗨av一区二区三区 | 欧美日韩高清丝袜 | 日本成人不卡 | 欧美日韩免费一区 | 99精品区 | 又大又长粗又爽又黄少妇视频 | 久久精品无码Av中文字幕 | 日韩怡春院 | 欧美日韩精品区别 | 亚洲欧美经典 | 日韩人妻一区二区三区 | 岛国a视频| 久久久免费观看 | 日本一二三区视频在线 | 国产福利免费 | 香蕉视频首页 | 亚洲色成人网站www永久四虎 | 日本草逼视频 | 91原视频 | 国产精品天天av精麻传媒 | 亚洲字幕av| 深夜福利网站在线观看 | 日本一区二区三区四区在线观看 | 国产精品对白 | 成人久久av | 在线免费看黄网站 | 奇米久久 | 国产精品第9页 | 超碰97自拍 | av黄在线观看 | 久久草精品 | 男女互操视频 | 亚洲一道本| 欧美性猛交ⅹ乱大交3 | 成年人在线观看av | 久久与婷婷 | 精品国产乱码久久久久久牛牛 | av丁香| 国产在线视频91 | 国产伦精品一区二区 | 韩日视频在线观看 | 白浆在线播放 | 精品人妻互换一区二区三区 | 国产精品xxx视频 |