文档章节

并发编程实战 1.9. 线程组 - ThreadGroup

火犀牛
 火犀牛
发布于 2016/05/11 17:26
字数 755
阅读 4
收藏 0

如果想对一组线程进行统一操作,可以使用ThreadGroup类

范例: 模拟搜索文件,开启十个线程查询文件(使用sleep来模拟),当其中有一个线程找到之后,interrupt。

package com.rr.concurrent.chapter1.recipe10.test;

import java.util.Random;
import java.util.concurrent.TimeUnit;

/**
 * Created by isaac_gu on 2016/5/11.
 */
public class SearchTask implements Runnable {
    @Override
    public void run() {
        try {
            int time = new Random().nextInt(10) + 15;
            System.out.printf("%s 线程开始查找(%d秒)!\n", Thread.currentThread().getName(), time);

            //查询time秒
            TimeUnit.SECONDS.sleep(time);

            System.out.printf("%s 线程找到文件!\n", Thread.currentThread().getName());
        } catch (InterruptedException e) {
            System.out.printf("%s 线程被打断!\n", Thread.currentThread().getName());
            return;
        }
    }
}

测试:

package com.rr.concurrent.chapter1.recipe10.test;

import java.util.concurrent.TimeUnit;

/**
 * Created by isaac_gu on 2016/5/11.
 * 范例: 模拟搜索文件,开启十个线程查询文件(使用sleep来模拟),当其中有一个线程找到之后,interrupt
 */
public class Test {
    public static void main(String[] args) {
        //定义一个线程组
        ThreadGroup threadGroup = new ThreadGroup("searcher");
        SearchTask searchTask = new SearchTask();

        //每秒创建一个查询线程
        for (int i = 0, len = 10; i < len; i++) {
            //把线程组加到线程中
            new Thread(threadGroup, searchTask).start();
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        //打印查询期间 threadGroup的信息
        printDetail(threadGroup);

        //等待查询结果 - 每秒查看一次运行情况
        waitResult(threadGroup);

        //打断
        threadGroup.interrupt();
    }

    /**
     * 打印查询期间 threadGroup的信息
     *
     * @param threadGroup
     */
    private static void printDetail(ThreadGroup threadGroup) {
        System.out.println("******************************** threadGroup detail ******************************");
        System.out.println("                          ------ threadGroup.list(): ------");
        threadGroup.list();

        System.out.println("                          ------ 当前活动的线程数 ------");
        System.out.println(threadGroup.activeCount());

        System.out.println("                          ------ 每个线程的状态 ------");
        //创建一个线程数组
        Thread[] threads = new Thread[threadGroup.activeCount()];
        //把活动的线程加到线程数组中
        threadGroup.enumerate(threads);

        //遍历
        for (Thread thread : threads) {
            System.out.printf("%s 线程的状态: %s\n", thread.getName(), thread.getState());
        }

        System.out.println("******************************** threadGroup detail END ******************************");
    }

    /**
     * 每秒查询一次结果
     *
     * @param threadGroup
     */
    private static void waitResult(ThreadGroup threadGroup) {
        while (threadGroup.activeCount() > 9) {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

运行结果:

Thread-0 线程开始查找(15秒)!
Thread-1 线程开始查找(22秒)!
Thread-2 线程开始查找(19秒)!
Thread-3 线程开始查找(24秒)!
Thread-4 线程开始查找(15秒)!
Thread-5 线程开始查找(20秒)!
Thread-6 线程开始查找(19秒)!
Thread-7 线程开始查找(22秒)!
Thread-8 线程开始查找(17秒)!
Thread-9 线程开始查找(20秒)!
******************************** threadGroup detail ******************************
                          ------ threadGroup.list(): ------
java.lang.ThreadGroup[name=searcher,maxpri=10]
    Thread[Thread-0,5,searcher]
    Thread[Thread-1,5,searcher]
    Thread[Thread-2,5,searcher]
    Thread[Thread-3,5,searcher]
    Thread[Thread-4,5,searcher]
    Thread[Thread-5,5,searcher]
    Thread[Thread-6,5,searcher]
    Thread[Thread-7,5,searcher]
    Thread[Thread-8,5,searcher]
    Thread[Thread-9,5,searcher]
                          ------ 当前活动的线程数 ------
10
                          ------ 每个线程的状态 ------
Thread-0 线程的状态: TIMED_WAITING
Thread-1 线程的状态: TIMED_WAITING
Thread-2 线程的状态: TIMED_WAITING
Thread-3 线程的状态: TIMED_WAITING
Thread-4 线程的状态: TIMED_WAITING
Thread-5 线程的状态: TIMED_WAITING
Thread-6 线程的状态: TIMED_WAITING
Thread-7 线程的状态: TIMED_WAITING
Thread-8 线程的状态: TIMED_WAITING
Thread-9 线程的状态: TIMED_WAITING
******************************** threadGroup detail END ******************************
Thread-0 线程找到文件!
Thread-4 线程被打断!
Thread-7 线程被打断!
Thread-8 线程被打断!
Thread-3 线程被打断!
Thread-2 线程被打断!
Thread-1 线程被打断!
Thread-9 线程被打断!
Thread-5 线程被打断!
Thread-6 线程被打断!

 

© 著作权归作者所有

共有 人打赏支持
火犀牛
粉丝 0
博文 27
码字总数 12180
作品 0
海淀
程序员
Java并发编程初级篇(九):线程组

Java API提供了一个线程组类ThreadGroup,这个类提供了一些方法可以让我们方便地对加入这个线程组的多个线程进行操作。 想使用线程组首先需要实例化一个线程组对象,并把创建的线程加入到这个...

阿拉德大陆的魔法师
2016/11/23
41
0
ThreadFactory & ThreadGroup

原本想给 多线程任务 做一个挂起(暂停)功能,然后配合 httpcomponents-asyncclient 并发测试,结果意外令人汗颜,竟然CPU占用100%。。。 使用VisualVM观察CPU抽样,发现org.apache.http.i...

goto-array
2013/09/01
0
0
Java多线程(全)学习笔记(中)

四.多线程的同步 以一个取钱列子来分析:(用户登录那些省略) Accout类: /*银行取钱,账户类/ public class Accout { //账户编号 private String accoutNo; //账户余额 private double b...

明舞
2014/07/27
0
0
jmeter Http Request

1.Jmeter 概要描叙 jmeter 是一款专门用于功能测试和压力测试的轻量级测试开发平台。多数情况下是用作压力测试,功能上来说,整个平台实现了许多和互联网相关的网络测试组件,同时还保留着很...

Canaan_
2016/04/30
108
0
Java并发编程实战--笔记二

第5章:基础构建模块      ConcurrentHashMap 与其他并发容器一起增强了同步容器类:他们提供的迭代器不会抛出 ConcurrentModificationException ,因此不需要在迭代过程中对容器加锁。 ...

xunzaosiyecao
2017/10/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

java工程师用spring boot和web3j构建以太坊区块链应用

区块链最近IT世界的流行语之一。这项有关数字加密货币的技术,并与比特币一起构成了这个热门的流行趋势。它是去中心化的,不可变的分块数据结构,这是可以安全连接和使用的密码算法。在这种结...

笔阁
6分钟前
1
0
聊聊sentinel的SentinelWebAutoConfiguration

序 本文主要研究一下sentinel的SentinelWebAutoConfiguration SentinelWebAutoConfiguration spring-cloud-alibaba-sentinel-autoconfigure-0.2.0.BUILD-SNAPSHOT-sources.jar!/org/springf......

go4it
8分钟前
0
0
java ArrayList 根据对象内的属性排序

//根据修改时间排序Comparator com = new Comparator<ReleaseInfo>() {public int compare(ReleaseInfo reInfo1, ReleaseInfo reInfo2) { //return reInfo2.getModifyTime().c......

成长中的小白
9分钟前
0
0
PowerDesigner p f m

(非原创) P:PirmaryKey 主键 F:ForeignKey 外键 M:Mandatory 强制要求(不能为空) 主键: 主键是数据表的唯一索引,比如学生表里有学号和姓名,姓名可能有重名的,但学号确是唯一的,你要从...

森火
9分钟前
0
0
Nexus Repository Manager 搭建私有docker仓库

Nexus Repository Manager 搭建私有docker仓库 2018年05月08日 14:44:23 阅读数:115 1.下载nexus3的镜像: docker pull sonatype/nexus3 2.使用镜像启动一个容器: docker run -d --name n...

linjin200
10分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部