当前位置:网站首页>線程組ThreadGroup使用介紹+自定義線程工廠類實現ThreadFactory接口
線程組ThreadGroup使用介紹+自定義線程工廠類實現ThreadFactory接口
2022-04-23 14:13:00 【pureluckyfish】
一、ThreadGroup類介紹
線程組是一個樹形結構 ,ThreadGroup類有一些方法可以删除或者新增維護這棵樹,也有一些查詢樹節點狀態和層級關系的方法;線程組的權限控制和linux的屬主屬組類似:線程只允許訪問關於它自己的線程組的信息,但是不允許訪問它所在線程組的父線程組或任何其他線程組的信息。
代碼示例:
package com.yu;
public class ThreadGroupTest {
public static void main(String[] args) throws Exception {
ThreadGroup tg_parent = new ThreadGroup("父線程組");
ThreadGroup tg_son = new ThreadGroup(tg_parent, "子線程組");
Thread t1 = new Thread(tg_son, () -> {
System.out.println("線程名稱:" + Thread.currentThread().getName());
System.out.println("線程組名稱:" + Thread.currentThread().getThreadGroup().getName());
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "t1線程");
Thread t2 = new Thread(tg_parent, () -> {
System.out.println("線程名稱:" + Thread.currentThread().getName());
System.out.println("線程組名稱:" + Thread.currentThread().getThreadGroup().getName());
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "t2線程");
Thread t3 = new Thread(tg_parent, () -> {
System.out.println("線程名稱:" + Thread.currentThread().getName());
System.out.println("線程組名稱:" + Thread.currentThread().getThreadGroup().getName());
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "t2線程");
System.out.println("線程組名稱:"+t1.getThreadGroup().getName());
System.out.println("線程是否在給定的線程組中:"+t1.getThreadGroup().parentOf(tg_parent));
System.out.println("線程是否在給定的線程組中:"+t1.getThreadGroup().parentOf(tg_son));
System.out.println("線程組中活的線程數:"+tg_parent.activeCount());//是一個評估值
System.out.println("線程組中活的線程組數:"+tg_parent.activeGroupCount());//是一個評估值
System.out.println("線程組的最大優先級:"+t1.getThreadGroup().getMaxPriority());
}
}
使用場景: 1 大型任務,可分成多個獨立的子線程並發進行,只要其中的某個子線程完成了任務條件,就算任務完成,則調用 threadGroup.interrupt() 方法 其他的子線程就可以停止了;2 大型任務,可分成多個獨立的子線程並發進行,最後等待所有的子線程執行結束然後繼續往下執行。
二、ThreadFactory接口介紹
ThreadFactory是一個接口,只有一個Thread newThread(Runnable r) 方法;
自定義線程工廠實現類按照一定的規則像工廠流水線那樣生產線程,這些線程 “ 長得都挺像的 ” ;
自定義線程工廠實現類,可以跟踪線程池究竟在何時創建了多少線程,也可以自定義線程名稱,組,優先級,甚至直接設定所有線程為守護線程。可以通過自定義線程池更加自由的設置池子裏所有線程的狀態。
代碼示例:
package com.yu;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
public class ThreadFactoryTest {
public static void main(String[] args) throws Exception {
// 自定義線程工廠
ThreadFactory threadFactoryOwner = new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setName("threadFactoryOwner-pool-" + t.getId());
t.setDaemon(true);// 設置為守護進程
return t;
}
};
// 使用自定義的工廠創建線程池
ExecutorService executorService = Executors.newFixedThreadPool(10, threadFactoryOwner);
for (int i = 0; i < 10; i++) {
executorService.submit(() -> {
System.out.println("線程名稱:" + Thread.currentThread().getName());
System.out.println("線程線程組:" + Thread.currentThread().getThreadGroup());
System.out.println("線程ID:" + Thread.currentThread().getId());
System.out.println("==========================================");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
});
Thread.sleep(2000);
}
}
}
JDK默認的線程工廠實現類:創建線程池的時候指定線程工廠實現類,如果不指定則使用JDK默認的線程工廠。
三、二者的聯系
自定義線程工廠實現類的時候可以使用指定的線程組。
版权声明
本文为[pureluckyfish]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/04/202204231406486413.html
边栏推荐
- 关于云容灾,你需要知道这些
- 数据库DbVisualizer Pro报文件错误,导致数据连接失败
- mysql 5.1升级到5.610
- 政务云迁移实践 北明数科使用HyperMotion云迁移产品为某政府单位实施上云迁移项目,15天内完成近百套主机迁移
- 查询2013年到2021年的数据,只查询到2020的数据,遇到了这个问题所进行的解决办法
- leetcode--977. Squares of a Sorted Array
- 星界边境Starbound创意工坊订阅的mod的存放路径
- DeepinV20安装Mariadb
- pthread_ Why does self() repeat
- postman批量生产body信息(实现批量修改数据)
猜你喜欢
Postman的安装使用及填坑心得
OpenStack如何跨版本升级
Cdh6 based on CM management 3.2 cluster integration atlas 2 one
倒计时1天~2022云容灾产品线上发布会即将开始
关于NodeJS中JSON5的相关配置和使用
ThreadGroup ThreadGroup implémente l'interface threadfactory en utilisant la classe Introduction + Custom thread Factory
回顾2021:如何帮助客户扫清上云最后一公里的障碍?
VMware 15pro mounts the hard disk of the real computer in the deepin system
MySQL数据库讲解(九)
MySQL数据库讲解(十)
随机推荐
mysql查询库大小
ActiveMQ Basics
帆软中根据分类进行汇总
线程间控制之CountDownLatch和CyclicBarrier使用介绍
云迁移的六大场景
Multiple inheritance virtual base exercises
dp-能量项链
帆软报表设置单元格填报以及根据值的大小进行排名方法
在Clion中给主函数传入外部参数
Win10 comes with groove music, which can't play cue and ape files. It's a curvilinear way to save the country. It creates its own aimpack plug-in package, and aimp installs DSP plug-in
帆软中使用if else 进行判断-使用标题条件进行判断
dp-[NOIP2000]方格取数
squid代理
Check in system based on ibeacons
帆软调用动态传参的方法,在标题中设置参数
回顾2021:如何帮助客户扫清上云最后一公里的障碍?
rsync+inotify远程同步
Easyexcel读取excel表地理位置数据,按中文拼音排序
获取线程返回值Future接口与FutureTask类使用介绍
帆软中单元格中隔行变色以及数量大于100字体变大变红设置