首页 > 其他分享 >第十四章《多线程》第7节:线程组

第十四章《多线程》第7节:线程组

时间:2022-12-17 10:04:23浏览次数:58  
标签:group 14 Thread 16 ThreadGroup 线程 第十四章 多线程


多个线程可以组成一个线程组,线程组可以对一批线程统一调度和管理,也就是说,控制一个线程组相当于控制这个线程组中所有的线程。Java语言以ThreadGroup这个类来表示线程组这个概念。以ThreadGroup类对象作为构造方法的参数创建一个线程时,实际上就是指定这个线程归入某一个线程组,例如:

//创建一个名称为group的线程组
ThreadGroup group = new ThreadGroup("group");
//创建一个名为myThread的线程并指定这个线程归入group线程组
Thread thread = new Thread(group,"myThread");

从以上代码可以看出:创建线程时能够指定这个线程归入哪个线程组。如果没有指定线程归入哪个线程组,那么这个线程与创建它的线程同在一组。例如A线程创建了B线程,但没有指定B线程归入哪个线程组,那么B线程与A属于同一个线程组。从【例14_01】可以看出:主线程属于一个名为“main”的线程组,因此由主线程创建的子线程默认归入main线程组内。线程在创建之后就不能改变线程组,但Thread类提供了一个getThreadGroup()方法来获得其所属的线程组对象。

ThreadGroup类提供了一些方法来操作线程组,如下面的表14-5所示。

表14-5 ThreadGroup类的方法

方法

功能

String getName()

获取线程组的名称

int activeCount()

返回此线程组中活动线程的数目

void interrupt()

中断此线程组中的所有线程

boolean isDaemon()

判断该线程组是否是后台线程组

void setDaemon(boolean daemon)

把该线程组设置成后台线程组

ThreadGroup getParent()

返回当前线程组的父线程组

void setMaxPriority(int priority)

设置线程组的最高优先级

从表14-5可以看出:setDaemon方法能够把线程组设置为后台线程组,而后台线程组具有一个特征:当后台线程组的最后一个线程执行结束或被销毁后,后台线程组将自动销毁。此外,getParent()方法能够返回当前线程组的父线程组。一个大的线程组可以被划分为多个小的线程组,小线程组所在的大线程组就被称为父线程组。当父线程组调用activeCount()方法统计其组内活动线程数目时,其下属的每个小线程主中的活动线程数量都会被统计。下面的【例14_16】展示了使用ThreadGroup操作线程组的过程。

【例14_16 线程组】

Exam14_16.java

class MyThread extends Thread{
MyThread(ThreadGroup group,String name){
super(group,name);
}
public void run() {
try {
for (int i=1;i<=5;i++){
System.out.println(this.getName()+":"+i);
Thread.sleep(500);
}
}catch (Exception e){
System.out.println("线程"+this.getName()+"睡眠被中断");//①
}
}
}
public class Exam14_16 {
public static void main(String[] args) {
try {
ThreadGroup group = new ThreadGroup("group");
//创两个建线程并归入group线程组
Thread t1 = new MyThread(group,"A");
Thread t2 = new MyThread(group,"B");
System.out.println("线程组的名称:"+group.getName());
System.out.println("线程组是否为后台线程组:"+group.isDaemon());
System.out.println("group线程组的父线程组:"+group.getParent().getName());
t1.start();//启动t1
t2.start();//启动t2
Thread.sleep(1000);//主线程睡眠1000毫秒
group.interrupt();//②中止线程组中所有睡眠的线程
}catch (Exception e){
e.printStackTrace();
}
}
}

【例14_16】的main()方法中创建了线程组group,并调用group的各种方法获取线程组的相应属性,并且把两个线程t1和t2都归入group线程组。当t1和t2启动后,先让主线程睡眠1000毫秒,然后通过线程组的interrupt()中止睡眠中的子线程。【例14_16】的运行结果如图14-15所示。

第十四章《多线程》第7节:线程组_线程组

图14-15【例14_16】运行结果

从图14-15可以看出:如果线程组没有指定父线程组,那么将以系统创建的main线程组作为父线程组。此外,线程组的interrupt()能够中止线程组内睡眠中线程,但这会引起组内线程运行出现异常。

除阅读文章外,各位小伙伴还可以点击这里观看我在本站的视频课程学习Java!

 

标签:group,14,Thread,16,ThreadGroup,线程,第十四章,多线程
From: https://blog.51cto.com/u_2266836/5949449

相关文章

  • 第十四章《多线程》第6节:线程通信
    之前所有的例子中,线程的执行都具有一定的随机性。如果希望线程能够有序的执行,必须使用线程通信技术。Java语言提供了一些线程通信的机制能够保证线程的有序执行,本小节将详细......
  • 第十四章《多线程》第4节:控制线程
    从14.3小节所列举的各个例子可以很明显的看出:线程的执行有一定的随机性,如果不加以适当控制,会导致执行结果的不确定性。实际开发过程中,很多情况下都需要让线程按照程序员期望......
  • 线程池BUG复现和解决
    分析&疑问​​第一个思考的问题是:线程池为什么关闭了?​​​最新线程池、多线程系列面试题整理好了,点击​​Java面试库​​小程序在线刷题。代码中并没有手动关闭的地方。看......
  • 25selenium的无头模式,线程池,随机ua
    1.selenium的无头模式,后期有需要可直接提取#实现无可视化界面fromselenium.webdriver.chrome.optionsimportOptions#实现无头模式的操作chrome_options=Optio......
  • Servlet多线程
    Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类......
  • 19 Java内存模型与线程_JVM层面的锁优化
    目录1锁优化历史2自旋锁与自适应自旋2.1关于自旋锁2.1自旋锁优化:自适应自旋3锁消除4锁粗化5轻量级锁6偏向锁1锁优化历史synchronized从JDK1.0到JDK1.5,效率......
  • 18 Java内存模型与线程_JVM同步机制和锁类库实现线程安全
    目录1线程安全定义2Java数据与线程安全2.1不可变2.2绝对线程安全2.3相对线程安全2.4线程兼容2.5线程对立3Java线程安全支持3.1互斥同步3.1.1synchronized互斥同......
  • Java多线程详解(通俗易懂)
    一、线程简介1.什么是进程?电脑中会有很多单独运行的程序,每个程序有一个独立的进程,而进程之间是相互独立存在的。例如图中的微信、酷狗音乐、电脑管家等等。2.什么是......
  • 线程基础知识复习
    线程基础知识复习java8API文档https://www.matools.com/api/java8涉及到并发的包并发始祖多线程的好处提高程序性能,高并发系统提高程序吞吐量,异步+回调等生产......
  • Java并发多线程高频面试题
    并发知识不管在学习、面试还是工作过程中都非常非常重要,看完本文,相信绝对能助你一臂之力。1、线程和进程有什么区别?线程是进程的子集,一个进程可以有很多线程。每个进程都有......