3,ThreadGroup 的使用场景以及用法

1 一个大型任务,可分成多个独立的子线程并发进行,最后等待所有的子线程执行结束然后继续往下执行,

使用场景比如

要查找某个用户的最近三个月的通话记录,起 3 个子线程,分别查找最近三个月的记录,然后通过

                int activeCount = tgroup.activeCount();
                while ( activeCount > 0 ) {
                    System.out.println("activeCount=" + activeCount );
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    activeCount = tgroup.activeCount();
                }

阻塞住主线程,直到三个子线程全部执行结束,activeCount() == 0,继续玩下执行

2,一个大型任务,可分成多个独立的子线程并发进行,只要其中的某个子线程完成了任务条件,就算任务完成,则调用 threadGroup.interrupt() 方法 其他的子线程就可以停止了

使用场景如

用户表按用户ID分成了10个表,这时候想通过用户昵称找到这个用户,则这时候就可以使用threadGroup中的 interrupt 来实现了

 1 package com.zyguo.thread;
 2 
 3 public class SearchRunnable implements Runnable{
 4     private int sleepTime;
 5     public SearchRunnable( int sleepTime ){
 6         this.sleepTime = sleepTime;
 7     }
 8     
 9     @Override
10     public void run() {
11         try {
12             System.out.println( Thread.currentThread() + " begin search "  );
13             Thread.sleep( sleepTime );
14             System.out.println( Thread.currentThread() + " end search, 耗时 " + this.sleepTime );
15         } catch (InterruptedException e) {
16             System.out.println( Thread.currentThread() + " 被中断 "  );
17             //e.printStackTrace();
18         }
19     }
20     
21     
22 }
package com.zyguo.thread;

import java.util.ArrayList;


public class ThreadGroup_interrupt {
    public static void main(String[] args) {
        int threadNum = 10;
        final ThreadGroup tgroup = new ThreadGroup("search-threadgroup");
        ArrayList<Thread> tList = new ArrayList<>();
        //定义10个线程
        for( int i = 0; i < threadNum; i++ ){
            Thread t = new Thread( tgroup, new SearchRunnable( 5000 + i*1000) ,"search-thread-" + i);
            tList.add( t );
            t.start();
            System.out.println("start thread = " + t );
        }

        //监控线程的活动的子线程数
        Thread t = new Thread( new Runnable() {
            @Override
            public void run() {
                int activeCount = tgroup.activeCount();
                while ( activeCount > 0 ) {
                    System.out.println("activeCount=" + activeCount );
                    if( activeCount < 5 ){
                        System.out.println("找到了需要的文件,开始终止其他的子线程"   );
                        tgroup.interrupt();
                        break;
                    }
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    activeCount = tgroup.activeCount();
                }
            }
        });
        
        t.start();
        
        
        
        
        
    }
}

结果如下

start thread = Thread[search-thread-0,5,search-threadgroup]
Thread[search-thread-0,5,search-threadgroup] begin search 
start thread = Thread[search-thread-1,5,search-threadgroup]
Thread[search-thread-1,5,search-threadgroup] begin search 
start thread = Thread[search-thread-2,5,search-threadgroup]
Thread[search-thread-2,5,search-threadgroup] begin search 
start thread = Thread[search-thread-3,5,search-threadgroup]
Thread[search-thread-3,5,search-threadgroup] begin search 
start thread = Thread[search-thread-4,5,search-threadgroup]
Thread[search-thread-4,5,search-threadgroup] begin search 
Thread[search-thread-5,5,search-threadgroup] begin search 
start thread = Thread[search-thread-5,5,search-threadgroup]
start thread = Thread[search-thread-6,5,search-threadgroup]
Thread[search-thread-6,5,search-threadgroup] begin search 
start thread = Thread[search-thread-7,5,search-threadgroup]
Thread[search-thread-7,5,search-threadgroup] begin search 
start thread = Thread[search-thread-8,5,search-threadgroup]
Thread[search-thread-8,5,search-threadgroup] begin search 
start thread = Thread[search-thread-9,5,search-threadgroup]
Thread[search-thread-9,5,search-threadgroup] begin search 
activeCount=10
activeCount=10
activeCount=10
activeCount=10
activeCount=10
Thread[search-thread-0,5,search-threadgroup] end search, 耗时 5000
activeCount=9
Thread[search-thread-1,5,search-threadgroup] end search, 耗时 6000
activeCount=8
Thread[search-thread-2,5,search-threadgroup] end search, 耗时 7000
activeCount=7
Thread[search-thread-3,5,search-threadgroup] end search, 耗时 8000
activeCount=6
Thread[search-thread-4,5,search-threadgroup] end search, 耗时 9000
activeCount=5
Thread[search-thread-5,5,search-threadgroup] end search, 耗时 10000
activeCount=4
找到了需要的文件,开始终止其他的子线程
Thread[search-thread-7,5,search-threadgroup] 被中断 
Thread[search-thread-8,5,search-threadgroup] 被中断 
Thread[search-thread-6,5,search-threadgroup] 被中断 
Thread[search-thread-9,5,search-threadgroup] 被中断 
原文地址:https://www.cnblogs.com/zyguo/p/4350568.html