java 多线程通知 CountDownLatch 倒数计数器的使用
package com.hra.riskprice; import com.hra.riskprice.SysEnum.Factor_Type;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.*; class R1 implements Runnable{
public static int i=;
@Override
public void run() { try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d = new Date();
String dateNowStr = sdf.format(d);
System.out.println("before:");
System.out.println(dateNowStr);
System.out.println("当前值是:"+i++);
Thread.sleep();
System.out.println("after:");
System.out.println(dateNowStr);
} catch (InterruptedException e) {
e.printStackTrace();
}
} }
@SpringBootApplication
public class RiskpriceApplication { public static long time (int concurrency, final Runnable action)throws InterruptedException{
final CountDownLatch ready=new CountDownLatch(concurrency);
final CountDownLatch start=new CountDownLatch();
final CountDownLatch done=new CountDownLatch(concurrency);
for(int i=;i<;i++){
new Thread(new Runnable() {
@Override
public void run() {
ready.countDown();
try {
start.await();
action.run();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}catch (Exception ex){
String msg=ex.getMessage();
}
finally {
done.countDown();
}
}
}).start(); }
ready.await();
long startNano=System.nanoTime();
start.countDown();
done.await();
return System.nanoTime()-startNano; } public static void main(String[] args) {
R1 r=new R1(); try{
long l=time(,r)/;
System.out.println("用时:"+l);
}
catch (InterruptedException e){
Thread.currentThread().interrupt();
}
}
} 注意 for(int i=;i<concurrency;i++)代码concurrency的当前值是5,这个数值如果小于5,就会造成线程饥饿死锁 ,也就是说至少要创建与指定并发级别一样多的线程,否则这个测试永远不会结束 还有一点,我上面没有使用线程池,如果知道执行的线程数目,那么可用如下的方法替代 使用 ExecutorService excutor= Executors.newFixedThreadPool(concurrency),如此更优
public static long time (int concurrency, final Runnable action)throws InterruptedException{
ExecutorService excutor= Executors.newFixedThreadPool(concurrency);
final CountDownLatch ready=new CountDownLatch(concurrency);
final CountDownLatch start=new CountDownLatch(1);
final CountDownLatch done=new CountDownLatch(concurrency);
for(int i=0;i<concurrency;i++){
excutor.execute(new Runnable() {
@Override
public void run() {
ready.countDown();
try {
start.await();
action.run();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}catch (Exception ex){
String msg=ex.getMessage();
}
finally {
done.countDown();
}
}
});
}
ready.await();
long startNano=System.nanoTime();
start.countDown();
done.await();
return System.nanoTime()-startNano;
}
java 多线程通知 CountDownLatch 倒数计数器的使用的更多相关文章
- java 多线程 day16 CountDownLatch 倒计时计数器
import java.util.concurrent.CountDownLatch;import java.util.concurrent.CyclicBarrier;import java.uti ...
- Java多线程:CountDownLatch、CyclicBarrier 和 Semaphore
场景描述: 多线程设计过程中,经常会遇到需要等待其它线程结束以后再做其他事情的情况. 有几种方案: 1.在主线程中设置一自定义全局计数标志,在工作线程完成时,计数减1.主线程侦测该标志是否为0,一 ...
- java多线程对CountDownLatch的使用实例
介绍 CountDownLatch是一个同步辅助类,它允许一个或多个线程一直等待直到其他线程执行完毕才开始执行. 用给定的计数初始化CountDownLatch,其含义是要被等待执行完的线程个数. 每 ...
- Java多线程-----理解CountDownLatch
CountDownLatch简介 CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier.Semaphore.ConcurrentHa ...
- java多线程并发控制countDownLatch和cyclicBarrier的使用
java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个处理都可以用一个线程来执行,所有处理完成了之后才会返回给用 ...
- Java 多线程系列 CountDownLatch
CountDownLatch 一个或多个线程等待其他线程完成操作后在在执行 CountDownLatch通过一个计数器来实现,await方法阻塞直到 countDown() 调用计数器归零之后释放所有 ...
- java多线程无锁和工具类
1 无锁 (1) cas (compare and swap) 设置值的时候,会比较当前值和当时拿到的值是否相同,如果相同则设值,不同则拿新值重复过程:注意,在设置值的时候,取值+比较+设值 是一条c ...
- Java多线程-两种常用的线程计数器CountDownLatch和循环屏障CyclicBarrier
Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-从一个错误的双重校验锁 ...
- Java多线程系列——计数器 CountDownLatch
简介: CountDownLatch 是一个非常实用的多线程控制工具类,通常用来控制线程的等待,它可以让某个线程等待直到倒计时结束 CountDownLatch 提供了两个主要的方法,await(). ...
随机推荐
- 怎样生成一个顶点迭代器(MItMeshVertex)
最近修改一个maya中的jlCollisionDeformer工具,该工具有一个明显不足,变形后顶点分布太乱,无法满足生产需求.于是考虑对该变形后的顶点进行平滑处理.既然要做平滑处理就要获取当前点及与 ...
- Django2.0资料
The Django Book 2.0 中文版:点击下载 Django课件和代码:点击下载
- [转][C#]程序的动态编译
转自:https://blog.csdn.net/clb929/article/details/51385399 附 文件下载
- Linux根据MAC地址自动设置IP
Linux根据MAC地址自动设置IP #!/bin/sh #============config============ route_defa=60.12.70.65 addr_ip= link_ma ...
- 经典笔试题型----IT经理(IT Manager)
一般企业设置IT部门都是服务性质,虽然谈IT需要成为战略部门许多年,但用脑子想下,这概率有多少?企业存在的第一目标是:赚取利润.贸易型企业最重要的部门为销售部,生产型企业最重要的部门为销售部与生产部, ...
- SAS LOGISTIC 逻辑回归中加(EVENT='1')和不加(EVENT='1')区别
区别在于:最大似然估计分析中估计是刚好正负对调加上EVENT:%LET DVVAR = Y;%LET LOGIT_IN = S.T3;%LET LOGIT_MODEL = S.Model_Params ...
- 推导式_字典_enumerate
字典推导式_enumerate: ''' 功能: 枚举, 拿出iter的每一个元素和索引(可以设置start改变) 组队放入一个元祖中返回 参数:iterable, start(指定索引开始的位置) ...
- 01.JDBC操作数据库-快速入门操作
/** * 简单入门操作 * 注:先将mysql-connector-java-5.1.36.jar 构建 Build Path环境当中去 * @param args * @throws Except ...
- postgresql数据库3种程序(rule,trigger ,FUNCTION )
1. CREATE [ OR REPLACE ] RULE name AS ON event TO table_name [ WHERE condition ] DO [ ALSO | INSTEAD ...
- 用户名、密码等15个常用的js正则表达式
本文收集整理了15个常用的javaScript正则表达式,其中包括用户名.密码强度.整数.数字.电子邮件地址(Email).手机号码.身份证号.URL地址. IPv4地址. 十六进制颜色. 日期. Q ...