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 倒数计数器的使用的更多相关文章

  1. java 多线程 day16 CountDownLatch 倒计时计数器

    import java.util.concurrent.CountDownLatch;import java.util.concurrent.CyclicBarrier;import java.uti ...

  2. Java多线程:CountDownLatch、CyclicBarrier 和 Semaphore

    场景描述: 多线程设计过程中,经常会遇到需要等待其它线程结束以后再做其他事情的情况. 有几种方案:   1.在主线程中设置一自定义全局计数标志,在工作线程完成时,计数减1.主线程侦测该标志是否为0,一 ...

  3. java多线程对CountDownLatch的使用实例

    介绍 CountDownLatch是一个同步辅助类,它允许一个或多个线程一直等待直到其他线程执行完毕才开始执行. 用给定的计数初始化CountDownLatch,其含义是要被等待执行完的线程个数. 每 ...

  4. Java多线程-----理解CountDownLatch

       CountDownLatch简介  CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier.Semaphore.ConcurrentHa ...

  5. java多线程并发控制countDownLatch和cyclicBarrier的使用

    java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个处理都可以用一个线程来执行,所有处理完成了之后才会返回给用 ...

  6. Java 多线程系列 CountDownLatch

    CountDownLatch 一个或多个线程等待其他线程完成操作后在在执行 CountDownLatch通过一个计数器来实现,await方法阻塞直到 countDown() 调用计数器归零之后释放所有 ...

  7. java多线程无锁和工具类

    1 无锁 (1) cas (compare and swap) 设置值的时候,会比较当前值和当时拿到的值是否相同,如果相同则设值,不同则拿新值重复过程:注意,在设置值的时候,取值+比较+设值 是一条c ...

  8. Java多线程-两种常用的线程计数器CountDownLatch和循环屏障CyclicBarrier

    Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-从一个错误的双重校验锁 ...

  9. Java多线程系列——计数器 CountDownLatch

    简介: CountDownLatch 是一个非常实用的多线程控制工具类,通常用来控制线程的等待,它可以让某个线程等待直到倒计时结束 CountDownLatch 提供了两个主要的方法,await(). ...

随机推荐

  1. uniDAC的安装和使用

    1.解压后把UniDAC文件夹 2.在UniDAC\Source\Delphi7文件夹中找到Make.bat文件,鼠标右键“编辑”确认DELPHI7的安装路径是否正确(建议:设置成绝对路径了,防止因为 ...

  2. 1131(★、※)Subway Map

    思路:DFS遍历 #include <iostream> #include <map> #include <vector> #include <cstdio& ...

  3. 如何从 VSS 迁移到Team Foundation Server

    TFS 2012自带了vss upgrade wizard工具, 在Team Foundation Server管理控制台左侧的最后一个菜单其他工具和组件中,选择Visual SourceSafe升级 ...

  4. MFC文件处理

    计算机室如何管理自身所存放着的大量的信息的呢?windows的磁盘管理程序为我们提供了一套严密而又高效的信息组织形式--硬盘上的信息是以文件的形式被管理的. 面向存储的文件技术 什么是文件?计算机中, ...

  5. 20165312 2017-2018-2 《JAVA程序设计》第6周学习总结

    20165312 2017-2018-2 <JAVA程序设计>第6周学习总结 一.在本周学习过程中遇到的问题以及对上周测试的查漏补缺 编写110页代码时出现问题,主类Test中创建CPU对 ...

  6. composer在phpstorm中安装代码库

    E:\php\PHPTutorial\WWW\kmmhtt>composer install composer 安装地址 :https://getcomposer.org/download/

  7. 二、CSS选择器

    1.CSS派生选择器 概念:通过依据元素在其位置的上下文关系来定义样式. 实例: <!--index.html--> <!DOCTYPE html> <html lang ...

  8. [Oracle,2018-02-07] Oracle 报错:“ORA-02292:违反完整约束条件(XXX.FKXXX)

    报错的原因很清楚,就是你要删除的记录是另外某条记录的外键,解决办法: 1.删除子记录,在删除本记录: 2.暂时禁用此外键(适合在测试后清除所有记录的情况,记得最后要恢复此外键) 解决办法有了,现在最主 ...

  9. python 的序列化和反序列化

    什么是序列化?简单来说就是将数据存储到物理内存上的过程叫序列化. 什么是反序列化?将数据从物理内存存储到程序内存的过程叫做反序列化. 下面来看一下python中使用json进行序列化和反序列化的实例d ...

  10. IntelliJ IDEA 导入多个maven项目

    IntelliJ IDEA的功能十分强大  我们日常开发项目会分多个maven项目 idea单个打开切换很是麻烦 下边是idea可以同时导入多个项目的方法 1.选择 FIle -> NEW -& ...