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(). ...
随机推荐
- 【OpenStack】相关概念
网络 network和subnet Service subnets: 创建network,subnet, instances 官方示例 Network components: Switches/ Ro ...
- python3学习笔记七(字典)
参照http://www.runoob.com/python3/python3-dictionary.html 字典 字典是另一种可变容器模型,且可以存储任意类型对象. dict1 = {key1:v ...
- 6.ST LINK 下调试异常
☆1.无法进入main函数(printf的影响)***为什么有时候可以进入main函数,有什么进入不了main函数? <1> 因为C语言默认使用显示器作为标准输出的设备,所以如果想利 ...
- python之路——13
王二学习python的笔记以及记录,如有雷同,那也没事,欢迎交流,wx:wyb199594 复习 1.函数 1.函数的定义和调用 2.参数及传递顺序 形参角度: 位置参数:*args:默认参数:**k ...
- vim中行末去掉^M
方式1: 输入 :%s/^M//g 方式2: 输入:%s/\r//g
- jsonp原理及同源策略
[个人学习笔记,如有问题还请前辈纠正] jsonp 是用来跨域读取数据的,为什么从不同的域访问数据要用jsop呢?这源于一个著名的安全策略--同源策略,即: 协议.端口号.域名相同 举例说明:http ...
- android 开发 View _6_Canvas详解
牛逼大神的博客地址:http://www.gcssloop.com/customview/Canvas_BasicGraphics 安卓自定义View进阶-Canvas之绘制图形 在上一篇自定义Vie ...
- 来自Github的优秀源码(python操作iframe框架网页)
#Please use your username and password for academia in codeimport timefrom selenium import webdriver ...
- c# post 接收传来的文件
private void UploadFile() { // //......其他代码 // HttpFileCollection files = HttpContext.Current.Reques ...
- gitlab Api接口使用
官方文档 https://docs.gitlab.com/search/?q=api&idx=gitlab&p=1 示例:获取每个项目下的用户信息 #!/usr/bin/env pyt ...