博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java.util.concurrent.CountDownLatch组件说明
阅读量:5885 次
发布时间:2019-06-19

本文共 2708 字,大约阅读时间需要 9 分钟。

hot3.png

一、CountDownLatch

1、功能说明:同步一个或者多个任务,强制它们等待由其它任务执行的一组操作完成。

2、注意事项:CountDownLatch被设计为只触发一次,计数值不能被重置,如果需要重置计数值的版本,请使用CyclicBarrier。

3、主要方法之构造方法CountDownLatch(int count)参数必须大于0的整数,这表示计数初始值。

4、主要方法之等待CountDownLatch.awit()等待计数值到达0。

5、主要方法之减少计数值CountDownLatch.countDown()将计数值减1。

6、如下例所示,同时执行多个任务,并且等待任务完成,在日常开发中常用于将业务分解成多个任务例用线程并行处理 ,充分发挥多线程的优势,当然也要注意限制线程数量,毕竟线程的开销也是不小的。

package org.com.jsoup;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class CountDownLatchTest {	/**	 * @param args	 * @throws InterruptedException 	 */	public static void main(String[] args) throws InterruptedException {		//定义10个线程		final int theadMax = 10;		//初使化10要与线程交互的锁存器		final CountDownLatch downLatch = new CountDownLatch(theadMax);		//定义一个线程执行器 创建固定大小(nThreads,大小不能超过int的最大值)的线程池		final ExecutorService exec = Executors.newFixedThreadPool(theadMax);		//记录开始时间,以纳秒为单位	    final long beginTime =	 System.nanoTime();		for(int i=0;i

7、既然是分解任务,又如何提取每个线程返回的结果呢?那么用下例来试试如何。

public static void test3() throws InterruptedException, ExecutionException{		//定义10个线程		final int theadMax = 10;		//初使化10要与线程交互的锁存器		final CountDownLatch downLatch = new CountDownLatch(theadMax);		//定义存储计算结果的集合		final List< String> list = new ArrayList
(); final ExecutorService exec = Executors.newFixedThreadPool(theadMax); //记录开始时间,以纳秒为单位 final long beginTime = System.nanoTime(); for(int i=0;i

8、对于上面的提取每个线程的返回结果的方案有更好的吗?看看下面的例子。 

public static void test2() throws InterruptedException, ExecutionException{		//定义10个线程				final int theadMax = 10;				//定义一个线程执行器,并可以取得第个线程执行后的结果 创建固定大小(nThreads,大小不能超过int的最大值)的线程池				final ExecutorService exec = Executors.newFixedThreadPool(theadMax);				final ExecutorCompletionService
futureExec = new ExecutorCompletionService
(exec); //定义一个存储可以异步取得返回值的Future集合 final List< Future
> list = new ArrayList< Future
>(); //记录开始时间,以纳秒为单位 final long beginTime = System.nanoTime(); for(int i=0;i
task = new Callable
(){ @SuppressWarnings("finally") @Override public String call() { try { //要执行的业务逻辑 Thread.sleep(10); } catch (InterruptedException e) { //处理异常 }finally{ //减少计数值 System.out.println(String.format("线程:%s执行完成,当时时间:%d", Thread.currentThread().getName(),System.nanoTime())); return Thread.currentThread().getName(); } } }; //将任务放入线程池执行 list.add(futureExec.submit(task)); } for (Future
future : list) { //取得异步计算结果 System.out.println( future.get()); } //关闭线程池 exec.shutdown(); System.out.println("执行完毕,用时:" +( System.nanoTime() -beginTime) + "纳秒"); }

 

转载于:https://my.oschina.net/20076678/blog/80346

你可能感兴趣的文章
js replace,正则截取字符串内容
查看>>
Thinkphp5笔记三:创建基类
查看>>
查询反模式 - GroupBy、HAVING的理解
查看>>
Android中EditText,Button等控件的设置
查看>>
TextKit简单示例
查看>>
网格最短路径算法(Dijkstra & Fast Marching)(转)
查看>>
软链接和硬链接详解
查看>>
Redis_master-slave模式
查看>>
彻底卸载删除微软Win10易升方法
查看>>
SWT/JFACE之环境配置(一)
查看>>
应用程序日志中总是说MS DTC无法正确处理DC 升级/降级事件,是什么意思
查看>>
mybatis数据处理的几种方式
查看>>
作业2
查看>>
远程主机探测技术FAQ集 - 扫描篇
查看>>
C++中调用python函数
查看>>
Nomad添加acl认证
查看>>
“TI门外汉”网路知识笔记一 OSI参考模型
查看>>
你不需要jQuery(五)
查看>>
DatanodeDescriptor说明
查看>>
ServlertContext
查看>>