Java 多线程(七)——线程组与线程池

1 线程组

1.1 概述

  • Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理。对线程组的控管理,即同时控制线程组里面的这一批线程。
  • 用户创建的所有线程都属于指定线程组,如果没有显示指定属于哪个线程组,那么该线程就属于默认线程组(即main线程组)。默认情况下,子线程和父线程处于同一个线程组。
  • 只有在创建线程时才能指定其所在的线程组,线程运行中途不能改变它所属的线程组,也就是说线程一旦指定所在的线程组,就直到该线程结束。
  • 线程组与线程之间结构类似于树形的结构:
    这里写图片描述

1.2 API介绍

1.2.1 Thread类

  • Thread(ThreadGroup group,Runnable target):group属于的线程组,target为新线程
  • Thread(ThreadGroup group,Runnable target,String name):group属于的线程组,target为新线程,name:线程名
  • Thread(ThreadGroup group,String name):新线程名为name,属于group线程组

1.2.2 ThreadGroup类

(1)构造方法

  • ThreadGroup(String name):以指定线程组名字来创建新线程组
  • ThreadGroup(ThreadGroup parent,String name):以指定的名字、指定的父线程组来创建一个新线程组。

(2)常用操作方法

  • int activeCount():获取线程组中活动线程的数量
  • interrupt():中断线程组中所有线程
  • isDaemon():是否为后台线程组
  • setDaemon(boolean daemon):设置为后台线程组
  • setMaxPriority(int pri):设置线程组的最高优先级

1.3 简单示例

package com.jtzen9;

public class Main {
   
    public static void main(String[] args) {

        // 获取主线程所在的线程组,这是所有线程默认的线程组
        ThreadGroup mainGroup = Thread.currentThread().getThreadGroup();
        System.out.println("主线程组的名字:" + mainGroup.getName());
        System.out.println("主线程组是否是后台线程组:" + mainGroup.isDaemon());

        new MyThread("主线程组的线程").start();

        ThreadGroup tg = new ThreadGroup("新线程组");
        tg.setDaemon(true);
        System.out.println("tg线程组是否是后台线程组:" + tg.isDaemon());

        MyThread tt = new MyThread(tg , "tg组的线程甲");
        tt.start();

        new MyThread(tg , "tg组的线程乙").start();
    }
}

class MyThread extends Thread {
   
    // 提供指定线程名的构造器
    public MyThread(String name) {
        super(name);
    }
    // 提供指定线程名、线程组的构造器
    public MyThread(ThreadGroup group , String name) {
        super(group, name);
    }
    public void run() {
        for (int i = 0; i < 20 ; i++ ) {
            System.out.println(getName() + " 线程的i变量" + i);
        }
    }
}

输出结果:

主线程组的名字:main
主线程组是否是后台线程组:false
tg线程组是否是后台线程组:true
主线程组的线程 线程的i变量0
主线程组的线程 线程的i变量1
主线程组的线程 线程的i变量2
主线程组的线程 线程的i变量3
主线程组的线程 线程的i变量4
tg组的线程甲 线程的i变量0
tg组的线程甲 线程的i变量1
tg组的线程甲 线程的i变量2
tg组的线程甲 线程的i变量3
tg组的线程甲 线程的i变量4
tg组的线程乙 线程的i变量0
tg组的线程乙 线程的i变量1
tg组的线程乙 线程的i变量2
tg组的线程乙 线程的i变量3
tg组的线程乙 线程的i变量4

1.4 未处理的异常

  ThreadGroup内定义了一个方法:void uncaughtException(Thread t,Throwable e),该方法可以处理该线程组内的任意线程所抛出的未处理异常。
  ThreadGroup类实现了Thread.UncaughtExceptionHandler接口,所以每个线程所属的线程组将会作为默认的异常处理器。当一个线程抛出未处理异常时,JVM会首先查找该异常对应的异常处理器处理该异常;否则,JVM将会调用该线程所属的线程组对象的uncaughtException()方法来处理该异常。
例子:

package com.jtzen9;

public class Main {
   
    public static void main(String[] args) {
        // 设置主线程的异常处理器
        Thread.currentThread().setUncaughtExceptionHandler(new MyExHandler());
        int a = 5 / 0;
        System.out.println("程序正常结束!");
    }
}
// 定义自己的异常处理器
class MyExHandler 
  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值