`
01jiangwei01
  • 浏览: 533828 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

多线程 -同时让10个线程执行一项工作。

 
阅读更多
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 要求实现10个线程同时执行,并通知比赛结束
 * 使用到的类有:
 * 	1:CountDownLatch,如其所写,是一个倒计数的锁存器,当计数减至0时触发特定的事件
 * 		1.1	countDown方法,计数器减1
 * 		1.2	await方法,阻塞当前线程,直到计数器为0
 * 		1.3 await(long timeout, TimeUnit unit),等待指定时长后立刻开始执行任务
 *  2:ExecutorService,线程池
 *  
 *  实现方式:
 *  	1:使用两个同步所,一个用来通知比赛开始,一个用来通知比赛结束。获取比赛结束才可以开始后续工作。
 * 
 * @author admin
 *
 */
public class SameTimeMoreThreads {
	
	public static final int threadCount = 10;
	
	public static void main(String[] args) {
		
		/**
		 * 线程池
		 */ 
		ExecutorService exe = Executors.newFixedThreadPool(threadCount);
		/**
		 * 口令枪
		 * 当口令枪起,比赛开始
		 */
		 final CountDownLatch matchGun = new CountDownLatch(1);
		 
		 /**
		  * 比赛者完成比赛用来通知的枪
		  */
		 final CountDownLatch endGun = new CountDownLatch(threadCount);
		 
		 for(int i=0;i<threadCount;i++){
			 Worker worker = new Worker(i+1,matchGun,endGun);
			 exe.execute(worker);            //分配线程
		 }
		 /**
		  * 比赛枪响起
		  */
		 matchGun.countDown();
         try{
        	 /**
        	  * 等待,直到最后一个队员完成比赛。
        	  */
        	 endGun.await();           
         }catch (InterruptedException e) {
             e.printStackTrace();
         }finally{
             System.out.println("比赛结束!");
         }
         /**
          * 关闭线程池。
          */
         exe.shutdown();
		 
	}
	/**
	 * 内部类,具体执行者
	 *
	 */
	static class Worker implements Runnable {
		/**
		 * 比赛队员牌号
		 */
		private int id;
		/**
		 * 比赛抢
		 */
	     private CountDownLatch begin;
	     /**
	      * 完成比赛通知枪
	      */
	    private CountDownLatch end;
		 
	    public Worker(int i, CountDownLatch begin, CountDownLatch end) {
	         super();
	         this.id = i;
	         this.begin = begin;
	         this.end = end;
	     }
	    
		public void run() {
			 try{
				 /**
				  * 等待比赛枪响起
				  */
	             begin.await(); 
	             /**
	              * 如果枪响,则开始进入比赛
	              */
	             Thread.sleep((long)(Math.random()*100));    //随机分配时间,即运动员完成时间
	             System.out.println("队员["+id+"]完成比赛.");
	         }catch (InterruptedException e) {
	             e.printStackTrace();
	         }finally{
	        	 /**
	        	  * 通知仲裁,完成该队员完成比赛
	        	  */
	             end.countDown();    //使end状态减1,最终减至0
	         }
			
		} 
		
	}
}

 

 

分享到:
评论

相关推荐

    110104010104.rar_MFC多任务_MFC多线程挂起_mfc 多线程_mfc 生产者

    线程是程序独立运行的基本单位,一个程序通过执行多个线程可以提高机器本身资源的利用率,同时也可以完成多任务并行运行的操作,多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。 互斥体 互斥体与临界区...

    Java第19讲:多线程(1).txt

    多线程并发执行可以提高程序的效率,可以同时完成多项工作 举例:电脑管家同时进行清理垃圾、查杀修复、优化加速,这就是多线程。 如果是单线程的话,在运行清理垃圾时,其它两个都得在等待,不能运行。 ...

    e语言-鱼刺多线程例程 [v4.7]代理智能提取

     (创建和获取状态)2.1 在执行工作前调用一次 `代理智能提取_创建()` (比如: `启动按钮_被单击`)2.2 你可以搞个时钟/定时器来刷新代理智能提取模块的工作状态2.3 当你打算结束工作/工作完毕时记得执行 `代理智能...

    用多线程同步方法解决生产者-消费者问题

    有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1~20这20个整型数。 (1) 每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者线程的标识符。 (2) ...

    ado连接池实例

    Delphi TThread中文注释2009-10-22 16:58TThread是一个抽象类,可以创建几个独立的线程。 类关系 TObject 在一个多线程的应用程序中创建一个TThread的后子类代表一个线程。每一新子类的TThread对象的实例是一个新...

    多线程、高性能采集器爬虫.net版源码,可采ajax页面

    1)支持多任务、多线程数据采集,同时支持一个采集任务多个 多线程、高性能采集器爬虫.net版源码,可采ajax页面 实例运行,即将采集任务规则与采集任务运行进行剥离,方便采集任务的配置、跟踪管理; 2)支持GET...

    定时执行专家 V6.1 - 《定时执行专家》是一款制作精良、功能强大、简单易用、毫秒级精度、专业级的定时任务执行软件。

    软件采用多线程并发方式检测任务触发和任务执行,能够达到毫秒级的执行精度,可以同时支持50个任务以上的毫秒级触发。 ▼最新版更新内容V6.1▼ - 版本更新 6.1 版(Build 701.20072022),GUI升级到wxWidgets 3.2.0...

    多线程编程指南PDF

    多线程基础介绍.........................................................................................................................................15 定义多线程术语...................................

    多线程应用程序调试技术

    对多线程应用程序进行调试是一项具有挑战性的任务。多线程应用程序采用的互斥、同步 技术使得调试时查看程序运行状态变得困难,线程的时序和多个线程间的交叉执行增加了 程序调试的复杂性。采用适用于调试多线程应用...

    JAVA生命游戏多线程模式(使用n个线程并行读取初始pgm文件,把图像分割为n份,分别计算出下一轮的细胞状态,然后重新整合)

    5.将生命游戏由单线程模式改为多线程模式,使用n个线程并行读取初始pgm文件,把图像分割为n份,分别计算出下一轮的细胞状态,然后重新整合为一个新一代细胞状态图。要求程序无死锁(Deadlock Free),无竞争条件(No...

    利用英特尔 线程构建模块

    MSC.Software SimXpert* 是一种全面集成的模拟环境,用于进行多学科分析。SimXpert 能够提供交互式图形界面,有助于工程师执行端到端模拟工作,包括本机计算机辅助设计 (CAD) 导入 (import)、预处理、模型设置、求解...

    易语言程序免安装版下载

    操作系统界面功能支持库(shell.fne)中的“执行()”命令增加一个参数“窗口显示方式”,作用与核心库“运行()”命令的同名参数一致。 6. 数据库操作支持库增加读写长整数字段的功能,但受限于系统接口暂不能读写...

    论文研究-多线程技术在实时测量系统中的应用.pdf

    实时测量系统具有很高的实时性要求,多线程技术以其能同时执行多项任务、最大程度利用多处理器性能的独特优点很好地满足了这一要求。在角变形实时测量系统中采用了多线程的编程方法进行程序设计来提高系统的实时性,...

    iOS高级程序员进阶——多线程编程核心技术模式篇

    多线程是一种软件实现多个线程并发执行任务的技术。在iOS开发中,实现多线程的的方式有很多种,常用的有pthread、NSThread、GCD与NSOperation。在实际应用中,多线程技术也有着非常多的使用场景,比如异步的网络请求...

    多线程编程指南(系统描述了线程标准 线程同步 多线程编程原则 等)

    1 多线程基础介绍15 定义多线程术语15 符合多线程标准16 多线程的益处17 提高应用程序的响应 17 有效使用多处理器17 改进程序结构17 占用较少的系统资源17 结合线程和RPC(远程过程调用)18 多线程概念18 并发性和...

    c#多线程编程基础

    在单个程序中同时运行多个线程完成不同的工作,称为多线程。如果某个线程进行一次长延迟操作, 处理器就切换到另一个线程执行。这样,多个线程的并行(并发)执行隐藏了长延迟,提高了处理器资源利用率,从而提高了整体...

    易语言-鱼刺多线程例程 [v4.7]代理智能提取

    2.1 在执行工作前调用一次 `代理智能提取_创建()` (比如: `启动按钮_被单击`) 2.2 你可以搞个时钟/定时器来刷新代理智能提取模块的工作状态 2.3 当你打算结束工作/工作完毕时记得执行 `代理智能提取_销毁()` 3. ...

    JavaScript多线程详解

    大家都知道javascript是单线程执行的,但是又可以通过setTimeout或者setInterval定时执行一个方法,通过Ajax可以在向服务器端发送请求没有收到回应可以继续执行主逻辑。这些是如何做到的呢,下面就来探讨下。 先看...

    多线程与异步套接字编程

    在Windows操作系统中,线程是指系统中最小的功能执行单元,其可以独立的完成某一项功能。所以在进行Windows编程中,如果用户使用多线程处理某个功能,那么该功能被处理的效率远比单个线程处理的效率高。在本章中,将...

Global site tag (gtag.js) - Google Analytics