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

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

时间:2023-01-02 18:34:19浏览次数: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()能够中止线程组内睡眠中线程,但这会引起组内线程运行出现异常。

本文字版教程还配有更详细的视频讲解,小伙伴们可以点击这里观看。

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

相关文章

  • 第十四章《多线程》第9节:ThreadLocal类
    ​如果多个线程共用一个对象,那么这个对象的属性值对于这些线程都是相同的。例如有一个a对象,它有一个x属性,如果x属性的值是1,那么对于任何一个线程而言,a对象的x属性都是1。但......
  • 第十四章《多线程》第4节:控制线程
    ​从14.3小节所列举的各个例子可以很明显的看出:线程的执行有一定的随机性,如果不加以适当控制,会导致执行结果的不确定性。实际开发过程中,很多情况下都需要让线程按照程序员期......
  • 第十四章《多线程》第5节:线程同步
    ​当两个或两个以上的线程需要共享资源,它们需要某种方法来确定资源在某一刻仅被一个线程占用,达到这个目的的过程叫做同步。如果线程在操作共享资源时没有实现同步,那么很有可......
  • 第十四章《多线程》第1节:线程基本原理
    ​计算机上可以运行程序,每一个正在运行着的程序都被称为“进程”,每个进程都拥有独立的系统资源以及地址空间,在没有进程允许的情况下,另一个用户进程不能访问这个进程的地址空......
  • 第十四章《多线程》第2节:线程的生命周期
    ​线程在被创建后会经历多个状态最后直至死亡,这个过程称为线程的“生命周期”。生命周期中包含很多状态,这些状态有:新生、就绪、运行、阻塞和死亡。线程有可能在几种状态之间......
  • 第十四章《多线程》第3节:创建线程
    ​Java语言中有一个专门表示线程的Thread类,这个类位于java.lang包下,因此在使用这个类时无需引入。Thread的方法定义了线程的基本操作,下面的表14-1展示了Thread类所定义的方......
  • java多线程
    1、线程:进程想要执行任务就需要依赖线程。换句话说,就是进程中的最小执行单位就是线程,并且一个进程中至少有一个线程。 线程不能独立存在,必须依赖进程,在进程中运行每一个进......
  • 静态方法如何调用非静态方法,创建线程的方式
    在静态方法中,new一个类对象,用类对象调用非静态方法第一种方式创建线程publicclassMain{  privateclassMyRunimplementsRunnable{    publicvoid......
  • C#开发的线程池和管理器 - 开源研究系列文章
          上次编写了一个小软件,用于练手及自己的一个小工具集合。今天把其中的线程池和管理器的代码抽取出来,写成一个博文,让需要的朋友能够进行学习和应用。    ......
  • 1.走近Java世界中的线程
    一.基本概念 进程是程序运行的实例。 进程是程序向操作系统申请资源(如内存空间和文件句柄)的基本单位。线程是进程中可独立执行的最小单位。 一个进程中可以包含多个......