`
Luob.
  • 浏览: 1588613 次
  • 来自: 上海
社区版块
存档分类
最新评论

JDK1.5 CountDownLatch

    博客分类:
  • Java
阅读更多
/*
* 还有一个利用场景: 应用启动的时候 ,检查所有的服务是否正确启动,如果正确启动,应用程序就可以启动成功.
**/


import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * CountDownLatch 模拟 运动会长跑  ,裁判 发令 --- 运动员开始努力奔跑  ---- 裁判收集结果
 * 1个裁判 和  3个运动员 
 */
public class CountDownLatchTest1 {

	public static void main(String[] args) {
		ExecutorService executor = Executors.newCachedThreadPool();
		final CountDownLatch referee = new CountDownLatch(1); 	//
		final CountDownLatch athletes = new CountDownLatch(3);  //
		
		CompletionService<String> completionService =new ExecutorCompletionService<String>(executor);  
		
		final Lock lock=new ReentrantLock();
		
		//创建要 运行的任务   长跑
		Callable<String> callable=new Callable<String>() {
			@Override
			public String call(){
				try {
					System.out.println("运动员"+Thread.currentThread().getName()+"等待裁判发令");
					referee.await();
					
					System.out.println("运动员"+Thread.currentThread().getName()+"收到裁判发令,已经出发");
					lock.lock();
					//模拟长跑任务  
					long stime=System.currentTimeMillis();
					String thread_name = Thread.currentThread().getName();
					for (int i = 0; i < thread_name.length(); i++) {
						System.out.print(thread_name.charAt(i));
						Thread.sleep(new Random().nextInt(10)*100);
					}
					System.out.println();
					System.out.println("运动员"+Thread.currentThread().getName()+"已经跑完");
					
					//跑完了
					athletes.countDown();
					return "运动员"+Thread.currentThread().getName()+"花的时间为:"+(System.currentTimeMillis()-stime);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}finally{
					 //lock.unlock();
				}
				return "运动员比赛出现失误";
			}
		};
		
		for (int i = 0; i < 3; i++) {
			completionService.submit(callable);
		}
		
		try {
			System.out.println("裁判"+Thread.currentThread().getName()+"即将发布命令");
			Thread.sleep((long)Math.random()*20000);
			referee.countDown();
			System.out.println("裁判"+Thread.currentThread().getName()+"已经发布命令,等待结果");
			athletes.await();
			System.out.println("裁判"+Thread.currentThread().getName()+"收到了结果如下:-----------------");
			
			for (int i = 0; i < 3; i++) {
				try {
					System.out.println(completionService.take().get());
				} catch (ExecutionException e) {
					e.printStackTrace();
				}
			}
			
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		executor.shutdown();
		
	}

}




import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @description  三个领导 审批  --一个采购员去采购 
 */
public class CountDownLatchTest2 {

	public static void main(String[] args) {
		ExecutorService service = Executors.newCachedThreadPool();
		final CountDownLatch leader = new CountDownLatch(3); //三个领导
		final CountDownLatch buyer = new CountDownLatch(1);  //只有一个裁判
		
		final Lock lock=new ReentrantLock();
		
		Runnable runnable = new Runnable() {
			@Override
			public void run() {
				try{
						System.out.println("领导"+Thread.currentThread().getName()+"开始进行了审批");
						lock.lock();
						String thread_name = Thread.currentThread().getName();
						for (int i = 0; i < thread_name.length(); i++) {
							System.out.print(thread_name.charAt(i));
						}
						System.out.println();
						System.out.println("领导"+Thread.currentThread().getName()+"已经审批完了");
						leader.countDown(); //一个已经结束
						
						if(leader.getCount()==0){
							buyer.countDown();
						}
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}finally{
					lock.unlock();
				}
			}
		};
		
		for (int i = 0; i < 3; i++) {
			service.execute(runnable);
		}
		
		try {
			System.out.println("采购员"+Thread.currentThread().getName()+"在等待,领导审批");
			leader.await();
			System.out.println("采购员"+Thread.currentThread().getName()+"的单子,已经通过了所有领导审批");
			System.out.println("采购员去采购了....");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		service.shutdown();
		
	}

}



/**
 * CountDownLatch 是一个倒计数的锁存器,当计数减至0时触发特定的事件。利用这种特性,可以让主线程 等待 子线程的结束运行
 */
public class CountDownLatchTest {
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ExecutorService service=Executors.newCachedThreadPool();
		final CountDownLatch cdOrder=new CountDownLatch(1);
		final CountDownLatch cdAnswer=new CountDownLatch(3);
		
		for (int i = 0; i < 3; i++) {
			Runnable runnable =new Runnable() {
				public void run() {
					try {
						System.out.println("线程"+Thread.currentThread().getName()+"正准备接受命令");
						cdOrder.await();
						System.out.println("线程"+Thread.currentThread().getName()+"已接受命令");
						Thread.sleep((long)Math.random()*10000);
						System.out.println("线程"+Thread.currentThread().getName()+"回应命令处理结果");
						cdAnswer.countDown();
					} catch (Exception e) {
						// TODO: handle exception
					}
				}
			};
			service.execute(runnable);
		}
		try {
			Thread.sleep((long)Math.random()*10000);
			System.out.println("线程"+Thread.currentThread().getName()+"即将发布命令");
			cdOrder.countDown();
			System.out.println("线程"+Thread.currentThread().getName()+"已经发布命令,正在等待结果...");
			cdAnswer.await();
			System.out.println("线程"+Thread.currentThread().getName()+"已经收到所有响应结果");
			
		} catch (Exception e) {
			// TODO: handle exception
		}

	}

}

分享到:
评论

相关推荐

    jdk1.5x64位 windows版.zip

    在并发编程方面,JDK1.5引入了并发工具类(java.util.concurrent),包括Semaphore、CyclicBarrier、CountDownLatch等,这些工具极大地简化了多线程编程中的同步和协调。 在内存模型和并发性能上,JDK1.5引入了Java...

    IBMJDK1.5linux.zip

    在压缩包"IBMJDK1.5linux.zip"中,主要包含的是IBM JDK 1.5的安装文件和相关文档。安装完成后,开发者可以通过设置环境变量(如JAVA_HOME、PATH)来使用这个JDK。通常,这个JDK会包含Java编译器(javac)、Java解释...

    JDK 1.5 for Windows

    **JDK 1.5 for Windows** Java Development Kit (JDK) 1.5,也称为 Java 5.0,是Sun Microsystems开发的一个重要的Java平台版本。它在2004年9月30日正式发布,引入了许多新的特性和改进,对Java编程语言和Java...

    JDK1.5 中文版文档.rar

    9. **并发API(Concurrent APIs)**: JDK1.5加强了对多线程编程的支持,引入了并发工具类如`java.util.concurrent`包,包括`ExecutorService`、`Semaphore`、`CountDownLatch`等,以及`java.util.concurrent.atomic`...

    jdk1.5并发新特性.

    JDK 1.5 引入了一系列重要的并发编程新特性,极大地改善了多线程环境下的程序设计。这些特性使得开发者能够编写更加高效、安全的并发应用程序。以下是对这些新特性的详细解释: 1. `TimeUnit`: `TimeUnit` 是一个...

    java JDK1.5实例宝典

    《Java JDK1.5实例宝典》是一本深入解析JDK1.5版本中关键特性和类库的实践指南,涵盖了Java Mail、Servlet、JSP以及多线程等多个核心领域。这本书通过丰富的实例来帮助读者理解和掌握Java编程的精髓。 在JDK1.5中,...

    java jdk 1.5 API html

    Java JDK 1.5,也被称为Java 5.0,是Java开发工具包的一个重要版本,于2004年发布。这个版本引入了大量的新特性,优化和改进,极大地提升了Java编程的效率和灵活性。本API HTML文档是开发者学习和查阅Java 1.5 API的...

    jdk 1.5API

    **Java Development Kit (JDK) 1.5 API** JDK 1.5,也被称为Java SE 5.0,是Java编程语言的一个重要版本,由Sun Microsystems(现为Oracle Corporation的一部分)于2004年9月30日发布。这个版本引入了许多新特性和...

    Java Threads Third Edition

    这本书详细对比了JDK 1.4和JDK 1.5之间的差异,帮助开发者理解不同版本下线程处理的进化与改进。 在Java编程中,线程是并发执行的程序片段,它使得一个应用程序可以在同一时间执行多个任务。Java提供了丰富的API来...

    backport-util-concurrent(2.2 /3.1)

    - 在3.1版本中,backport-util-concurrent引入了Phaser,这是一个可重用的同步帮助器类,支持多个参与者之间的有界同步,类似于CyclicBarrier和CountDownLatch,但更灵活。Phaser可以自动调整参与者的数量,并且在...

    0JDK1.6 API帮助文档_jdk1.6_

    2. **泛型(Generics)**:泛型在JDK1.5中引入,但在1.6版本中得到了进一步完善。泛型提供了一种方式来限制容器中存储的数据类型,增强了代码的类型安全性和可读性。 3. **可变参数(Variadic Parameters)**:JDK1.6...

    JDK_API_1_7_zh_CN.zip

    9. **并发工具类**:JDK 1.5引入了丰富的并发工具类,如`java.util.concurrent.locks`包中的`ReentrantLock`和`Condition`,提供了更高级的锁机制。 10. **Swing GUI**:虽然在`javax.swing`包中的Swing组件已经...

    jdk-1_5_0_22-windows-amd64

    首先,JDK 1.5,代号为" Tiger",是Java SE(标准版)的一个重大更新,于2004年发布。这个版本引入了许多新特性,极大地提升了Java编程的效率和灵活性。其中最重要的变化之一是泛型的引入,使得代码更具类型安全,...

    JDK API 1.6.0 中文版.zip

    1. **泛型(Generics)**:自JDK 1.5引入以来,泛型已经成为编写类型安全代码的标准方式。在1.6版本中,泛型的使用更加广泛,支持更多的语法糖,如类型通配符和泛型擦除。 2. **动态代理(Dynamic Proxies)**:JDK...

    JDK 1.6 API中文完整版

    2. **枚举(Enums)**:JDK 1.5引入的枚举类型,为创建固定的、有限数量的常量提供了一种强类型的方法,比传统的常量类更安全,使用也更便捷。 3. **并发编程改进**:JDK 1.6增强了并发编程的支持,包括`java.util....

    jdk api 1.8 最新版(中文版)

    3. **泛型**: JDK 1.5引入的泛型特性,允许在代码中指定容器元素的类型,提高了代码的类型安全性和可读性。 4. **I/O流**: `java.io`包提供了一系列的流类,用于处理文件读写、网络通信等操作。 5. **线程**: `...

    JDK1.6中文开发API

    2. **枚举(Enums)**:JDK1.5引入,1.6继续完善,枚举类型为常量集合提供了一种强大的、类型安全的表示方式。枚举类型不能被实例化,有助于防止错误和提高代码质量。 3. **并发(Concurrency)**:1.6版本对并发库...

    jdk1.6 64位 JAVA开发JDK

    1. **泛型的完全实现**:在JDK 1.5中泛型被引入,但存在类型擦除,JDK 1.6对其进行了进一步的完善,增强了泛型的使用体验。 2. **增强的Swing组件**:Swing库得到了改进,提供了更好的外观和感觉,以及更多的组件和...

    张孝祥Java多线程与并发库高级应用笔记

    - **JDK1.5线程并发库**:引入了更高级的并发控制机制,如`ExecutorService`、`Callable`、`Future`等,提供了更安全、更高效的多线程解决方案,减少了线程同步和死锁的风险。 ##### 2. 创建线程的两种传统方式 - ...

    JDK1.6 中文 CHM

    9. **枚举**: 从JDK1.5开始,枚举类型提供了一种声明常量的强类型方式,相比传统的整数常量或字符串常量,枚举更安全且易于使用。 10. **NIO (非阻塞I/O)**: `java.nio`包提供了非阻塞I/O功能,允许在单个线程中...

Global site tag (gtag.js) - Google Analytics