博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java多线程(十一):线程组
阅读量:3753 次
发布时间:2019-05-22

本文共 3521 字,大约阅读时间需要 11 分钟。

线程组

1201453-20190815143702662-1144406409.png

线程组可以批量管理线程和线程组对象。

一级关联

例子如下,建立一级关联。

public class MyThread43 implements Runnable{    public void run()    {        try        {            while (!Thread.currentThread().isInterrupted())            {                System.out.println("ThreadName = " + Thread.currentThread().getName());                Thread.sleep(3000);            }        }        catch (InterruptedException e)        {            e.printStackTrace();        }    }    public static void main(String[] args)    {        MyThread43 mt0 = new MyThread43();        MyThread43 mt1 = new MyThread43();        ThreadGroup tg = new ThreadGroup("新建线程组1");        Thread t0 = new Thread(tg, mt0);        Thread t1 = new Thread(tg, mt1);        t0.start();        t1.start();        System.out.println("活动的线程数为:" + tg.activeCount());        System.out.println("线程组的名称为:" + tg.getName());    }}

输出结果如下

活动的线程数为:2线程组的名称为:新建线程组1ThreadName = Thread-0ThreadName = Thread-1ThreadName = Thread-0ThreadName = Thread-1ThreadName = Thread-1ThreadName = Thread-0ThreadName = Thread-1ThreadName = Thread-0······

每隔三秒输出两个线程名称,符合预期。

线程组自动归组属性

public class ThreadDomain49 {    public static void main(String[] args) {        System.out.println("A处线程:" + Thread.currentThread().getName() + ", 所属线程:" + Thread.currentThread().getThreadGroup().getName() +                ", 组中有线程组数量:" + Thread.currentThread().getThreadGroup().activeGroupCount());        ThreadGroup group = new ThreadGroup("新的组");        System.out.println("B处线程:" + Thread.currentThread().getName() + ", 所属线程:" + Thread.currentThread().getThreadGroup().getName() +                ", 组中有线程组数量:" + Thread.currentThread().getThreadGroup().activeGroupCount());        ThreadGroup[] tg = new ThreadGroup[Thread.currentThread().getThreadGroup().activeGroupCount()];        Thread.currentThread().getThreadGroup().enumerate(tg);        for (int i = 0; i < tg.length; i++)            System.out.println("第一个线程组名称为:" + tg[i].getName());    }}

输出结果如下

A处线程:main, 所属线程:main, 组中有线程组数量:0B处线程:main, 所属线程:main, 组中有线程组数量:1第一个线程组名称为:新的组

没有指定线程组,则归属到当前线程所属的组。

根线程组

public class ThreadDomain50 {    public static void main(String[] args)    {        System.out.println(Thread.currentThread().getThreadGroup().getParent().getName());        System.out.println(Thread.currentThread().getThreadGroup().getParent().getParent().getName());    }}

运行结果

systemException in thread "main" java.lang.NullPointerException    at com.advance.MultiThread3.MyThread.ThreadDomain50.main(ThreadDomain50.java:14)

当前线程的线程组的父线程组是系统线程组;系统线程组的父线程组不存在;系统线程组就是根线程组。

批量停止组内线程

请看示例

public class MyThread44 extends Thread{    public MyThread44(ThreadGroup tg, String name)    {        super(tg, name);    }    public void run()    {        System.out.println("ThreadName = " + Thread.currentThread().getName() +                "准备开始死循环了");        while (!this.isInterrupted()){}        System.out.println("ThreadName = " + Thread.currentThread().getName() +                "结束了");    }    public static void main(String[] args) throws InterruptedException {        ThreadGroup tg = new ThreadGroup("我的线程组");        MyThread44 mt = null;        for (int i = 0; i < 3; i++)        {            mt = new MyThread44(tg, "线程" + i);            mt.start();        }        Thread.sleep(5000);        tg.interrupt();        System.out.println("调用了interrupt()方法");    }}

输出结果如下

ThreadName = 线程0准备开始死循环了ThreadName = 线程1准备开始死循环了ThreadName = 线程2准备开始死循环了调用了interrupt()方法ThreadName = 线程0结束了ThreadName = 线程2结束了ThreadName = 线程1结束了

可以看到,ThreadGroup的interrupt方法批量中断线程组的线程。

转载地址:http://lrasn.baihongyu.com/

你可能感兴趣的文章
几种常用的版本控制系统优缺点比较
查看>>
版本控制:SVN和GIT的一些使用感受
查看>>
RAID 技术全解
查看>>
DELL R720 服务器 RAID阵列卡配置介绍
查看>>
SVN服务器部署并实现双机同步及禁止普通用户删除文件
查看>>
SVN服务器搭建和使用(一)
查看>>
SVN服务器搭建和使用(二)
查看>>
SVN服务器搭建和使用(三)
查看>>
文件服务器的配置与管理(1) RAID技术
查看>>
文件服务器的配置与管理(2) 实现软RAID
查看>>
文件服务器的配置与管理(3) 共享文件夹的创建与使用
查看>>
TortoiseSVN新人使用指南
查看>>
visual svn使用教程
查看>>
版本控制系统客户端VisualSVN的安装与使用(for Visual Studio)
查看>>
小白教程:Visual Studio2017配置GitHub图文教程
查看>>
句柄和指针的区别
查看>>
VC编写的程序不能在其他机器上运行的解决方案
查看>>
VC编写的程序不能在其他机器上运行的解决方案(续)
查看>>
VS 中配置使用Visual SVN系列 一:SVN Server下载和安装
查看>>
VS 中配置使用Visual SVN系列 二:SVN Client(客户端)下载和安装
查看>>