文档章节

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

火犀牛
 火犀牛
发布于 2016/05/11 17:26
字数 755
阅读 6
收藏 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中的ThreadGroup线程组

ThreadGroup概述 在java中为了方便线程管理出现了线程组ThreadGroup的概念,每个ThreadGroup可以同时包含多个子线程和多个子线程组,在一个进程中线程组是以树形的方式存在,通常情况下根线程...

长头发-dawn
09/03
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

没有更多内容

加载失败,请刷新页面

加载更多

生物智能与AI——关乎创造、关乎理解(上)

摘要: 原来人工智能跟人类智能有那么深的联系! 几百万年前,第一次人类智能的星火出现在非洲大陆,并且持续发展,最终在大约10万年前在智人的大脑中达到顶峰。作为现代人类,我们只能想象我...

阿里云官方博客
5分钟前
0
0
MiniUi系列 详情逻辑

row是获取的行的数据,通过id去查看对应id的详情,所有数据是在datagrid加载完后的,比如有5条,我可以选中某一条,我也可以把获取到的数据直接传到详情页面,仅就是追加row.xx,row.xx,这样就...

architect刘源源
6分钟前
0
0
android adb实用命令小结

adb的全称为Android Debug Bridge.是android司机经常用到的工具.但是问题是那么多命令写代码已经够费劲了,过段时间在次使用时压根记不住呀.本次的大餐就是为此开篇的.这一次我们不记命令.要用...

天王盖地虎626
10分钟前
0
0
vagrant 虚拟机 磁盘100%解决

在日常开发中,我使用vagrant+VirtualBox搭建开发环境 docker+docker-compose搭建了php+nginx+redis+mysql+ELK(Elasticsearch+Kibana+Logstash+php)+phpredisadmin 但是搭建了环境之后发现磁...

DamienChen
15分钟前
0
0
详解如何用爬虫批量抓取百度搜索多个关键字数据

本文介绍如何使用软件的流程图模式,免费采集百度搜索多个关键字的信息数据。 软件下载网址:www.houyicaiji.com 采集结果预览: 下面我们来详细介绍一下如何使用流程图模式,采集在百度输入...

技术阿飞
17分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部