Java - CountDownLatch

9人阅读 评论(0) 收藏 举报
分类:
package Chapter02;

import java.util.concurrent.CountDownLatch;

/*
 * CountDownLatch:
 * 1. 如果count 计数不为0时,则当前线程呈wait 状态
 * 2. await 方法判断计数是否为0,不为0 则等待
 * 3. countDown 方法将计数减1
 */

public class _01_Run {

	public static void main(String[] args) {
		try {
			CountDownLatch comingTag = new CountDownLatch(10); //运动员
			CountDownLatch waitTag = new CountDownLatch(1); //裁判
			CountDownLatch waitRunTag = new CountDownLatch(10);
			CountDownLatch beginTag = new CountDownLatch(1);
			CountDownLatch endTag = new CountDownLatch(10);
			
			System.out.println("[解说员] 等待所有选手进入体育场.");
			MyThread[] threads = new MyThread[10];
			for (int i = 0; i < threads.length; i++) {
				threads[i] = new MyThread(comingTag, waitTag, waitRunTag,
						beginTag, endTag);
				threads[i].start();
			}
			comingTag.await();
			
			System.out.println("[裁判] “巡视5秒.”");
			Thread.sleep(5000);
			System.out.println("[裁判] 各就各位.");
			waitTag.countDown();
			waitRunTag.await();
			
			Thread.sleep(2000);
			System.out.println("[裁判] “啪.”");
			beginTag.countDown();
			endTag.await();
			
			System.out.println("[解说员] 比赛结束.");
		} catch (Exception e) { }
	}
	
	static class MyThread extends Thread {
		
		private CountDownLatch comingTag; //裁判等待所有运动员到来
		private CountDownLatch waitTag; //运动员等待裁判说准备
		private CountDownLatch waitRunTag; //运动员做好准备,等待发令枪
		private CountDownLatch beginTag; //起跑
		private CountDownLatch endTag; //所有运动员到达终点
		
		public MyThread(CountDownLatch comingTag, CountDownLatch waitTag,
				CountDownLatch waitRunTag, CountDownLatch beginTag,
				CountDownLatch endTag) {
			super();
			this.comingTag = comingTag;
			this.waitTag = waitTag;
			this.waitRunTag = waitRunTag;
			this.beginTag = beginTag;
			this.endTag = endTag;
		}
		
		@Override
		public void run() {
			try {
				String runner = this.getName();
				
				//热身
				System.out.println("运动员 "+ runner+ " 正走向起跑点.");
				Thread.sleep((int)(Math.random()* 10000));	
				System.out.println("运动员"+ runner+ " 已到达起跑点.");
				comingTag.countDown(); 
				System.out.println("运动员"+ runner+ " 等待准备.");
				waitTag.await(); 
				
				//蹲下
				System.out.println("运动员"+ runner+ " 等待发令.");
				Thread.sleep((int)(Math.random()* 10000));	
				waitRunTag.countDown();
				beginTag.await();
				
				//跑步
				System.out.println("运动员"+ runner+ " 在跑道上奔跑.");
				Thread.sleep((int)(Math.random()* 10000));
				System.out.println("运动员"+ runner+ " 到达终点.");
				endTag.countDown();
			} catch (Exception e) {	}
		}
	}
}

[解说员] 等待所有选手进入体育场.
运动员 Thread-0 正走向起跑点.
运动员 Thread-2 正走向起跑点.
运动员 Thread-3 正走向起跑点.
运动员 Thread-4 正走向起跑点.
运动员 Thread-1 正走向起跑点.
运动员 Thread-6 正走向起跑点.
运动员 Thread-5 正走向起跑点.
运动员 Thread-7 正走向起跑点.
运动员 Thread-9 正走向起跑点.
运动员 Thread-8 正走向起跑点.
运动员Thread-4 已到达起跑点.
运动员Thread-4 等待准备.
运动员Thread-7 已到达起跑点.
运动员Thread-7 等待准备.
运动员Thread-3 已到达起跑点.
运动员Thread-3 等待准备.
运动员Thread-6 已到达起跑点.
运动员Thread-6 等待准备.
运动员Thread-2 已到达起跑点.
运动员Thread-2 等待准备.
运动员Thread-9 已到达起跑点.
运动员Thread-9 等待准备.
运动员Thread-0 已到达起跑点.
运动员Thread-0 等待准备.
运动员Thread-1 已到达起跑点.
运动员Thread-1 等待准备.
运动员Thread-8 已到达起跑点.
运动员Thread-8 等待准备.
运动员Thread-5 已到达起跑点.
运动员Thread-5 等待准备.
[裁判] “巡视5秒.”
[裁判] 各就各位.
运动员Thread-4 等待发令.
运动员Thread-3 等待发令.
运动员Thread-2 等待发令.
运动员Thread-0 等待发令.
运动员Thread-7 等待发令.
运动员Thread-8 等待发令.
运动员Thread-5 等待发令.
运动员Thread-1 等待发令.
运动员Thread-9 等待发令.
运动员Thread-6 等待发令.
[裁判] “啪.”
运动员Thread-4 在跑道上奔跑.
运动员Thread-8 在跑道上奔跑.
运动员Thread-6 在跑道上奔跑.
运动员Thread-3 在跑道上奔跑.
运动员Thread-9 在跑道上奔跑.
运动员Thread-1 在跑道上奔跑.
运动员Thread-2 在跑道上奔跑.
运动员Thread-7 在跑道上奔跑.
运动员Thread-5 在跑道上奔跑.
运动员Thread-0 在跑道上奔跑.
运动员Thread-1 到达终点.
运动员Thread-0 到达终点.
运动员Thread-2 到达终点.
运动员Thread-9 到达终点.
运动员Thread-8 到达终点.
运动员Thread-5 到达终点.
运动员Thread-3 到达终点.
运动员Thread-4 到达终点.
运动员Thread-7 到达终点.
运动员Thread-6 到达终点.
[解说员] 比赛结束.

查看评论

Java学习指南系列(Java快速入门)

这是Java学习指南系列课程的第1篇,介绍Java语言的入门语法,引领希望学习Java语言编程的初学者进入Java大门。本课程不需要其他语言作为基础,可以直接学习。课程从Java开发平台的下载和安装开始,从浅到深、从易到难,循序渐进地进行语法讲解。为了让学员更好的掌握Java语言,本课程配套在线的Java题库及答案解析。相比于其他语言,Java语言更科学、更容易掌握,快来和大家一起学习Java吧。
  • 2017年08月09日 15:30

Java并发编程之——CountDownLatch的使用

最近在开发Android项目的时候有一个需求:在Service中开启多个线程并发的执行任务,当这三个线程执行完毕之后,主线程才能继续往下执行。刚开始使用的是AsyncTask+AtomicIntege...
  • liuyi1207164339
  • liuyi1207164339
  • 2016-06-06 18:54:53
  • 2614

Java线程池及CountDownLatch的使用

Java多线程除了可以直接使用Thread和Runnable来实现外,jdk5以后提供了一种更方便的使用方式:线程池(Executors),本章暂不介绍什么是线程池,以及线程池的分类和使用。主要介绍线...
  • wyc_cs
  • wyc_cs
  • 2016-07-25 12:43:23
  • 1721

Java中使用CountDownLatch进行多线程同步

CountDownLatch介绍在前面的Java学习笔记中,总结了Java中进行多线程同步的几个方法:1、synchronized关键字进行同步。2、Lock锁接口及其实现类ReentrantLock...
  • zbc1090549839
  • zbc1090549839
  • 2016-12-05 14:37:00
  • 1982

【JAVA】java中CountDownLatch的用法,实例讲解

CountDownLatch主要用于多线程环境中,当所有的线程都countDown了,就会释放所有的等待的线程,await在到0之前一直等待。 直接看一段代码: package thread.th...
  • chiweitree
  • chiweitree
  • 2015-07-30 15:24:57
  • 1361

深入学习理解java:CountDownLatch详解

今天在公司学习看到了它,翻一番文档,正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。在Java并发中,c...
  • baidu_23086307
  • baidu_23086307
  • 2016-11-12 15:33:43
  • 1857

Java并发之CountDownLatch源码分析

CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。内部采用的公平锁和共享锁的机制实现。 一、CountDownLatch的构...
  • zxdfc
  • zxdfc
  • 2016-10-07 23:50:58
  • 1958

java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例

1、CountDownLatch:一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。2、ThreadPoolExecutor/ExecutorService:线程池,使用...
  • javaloveiphone
  • javaloveiphone
  • 2017-01-25 15:18:23
  • 2548

Java 多线程 CountDownLatch 试用

简述: 使用Java多线程的库,包括
  • anialy
  • anialy
  • 2014-11-11 00:36:43
  • 933

Java笔记:CountDownLatch - 计数锁存器、Future、CyclicBarrier - 循环屏障 和 Semaphore - 信号量

有时在线程开发中遇到一些问题,如主线程启动了多个子线程,主线程需要在子线程都结束后再做一些处理,也就是说,主线程必须知道所有子线程都结束的时候。刚开始的时候自己写一个子线程列表,启动一个子线程,加1,...
  • a906998248
  • a906998248
  • 2015-09-15 16:54:15
  • 2427
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 16万+
    积分: 4151
    排名: 9244
    博客专栏
    最新评论