zoukankan      html  css  js  c++  java
  • 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] 被中断 
  • 相关阅读:
    技术债务MartinFlower
    如何定义产品愿景
    领域驱动设计阶段知识总结
    领域驱动设计的价值
    什么是数字产品
    NestOS 发布:基于华为欧拉开源系统的云底座操作系统
    架子鼓MIDI及相关软件
    TM4 JDK1.8连接SqlServer报错:The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL)
    关于GPL协议的理解(开源与商用、免费与收费的理解)
    nest js 限制客户端在一定时间内的请求次数
  • 原文地址:https://www.cnblogs.com/zyguo/p/4350568.html
Copyright © 2011-2022 走看看