标签:
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] 被中断
标签:
原文地址:http://www.cnblogs.com/zyguo/p/4350568.html