countdownlatch

java并发测试帮助方法

孤街浪徒 提交于 2020-01-17 11:00:13
public class SimulateHighConcurrency { public static void run(int num, Consumer<Thread> action) { Objects.requireNonNull(action); CountDownLatch countDownLatch = new CountDownLatch(1); for (int i = 0; i < num; i++) { new Thread(() -> { try { action.accept(Thread.currentThread()); countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); } //线程创建完成之后同时启动 countDownLatch.countDown(); } public static void main(String[] args) throws InterruptedException { CountDownLatch doneSignal = new CountDownLatch(2000); SimulateHighConcurrency.run(2000, (t) -> { System.out

java.util.concurrent.CountDownLatch

三世轮回 提交于 2020-01-16 08:40:01
from when and where: CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue,它们都存在于java.util.concurrent包下。 introduce: CountDownLatch这个类能够使一个线程等待其他线程完成各自的工作后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有的框架服务之后再执行。 function: CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。 doc: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html application: step 1: 构造器中的 计数值(count)实际上就是闭锁需要等待的线程数量 。这个值只能被设置一次,而且CountDownLatch 没有提供任何机制去重新设置这个计数值 。 step 2:

JAVA多线程(十三)Java多线程之CyclicBarrier

那年仲夏 提交于 2020-01-16 04:15:56
1.JAVA多线程(十三)Java多线程之CyclicBarrier    CyclicBarrier 和 CountDownLatch 非常类似,它也可以实现线程间的技术等待,但是它的功能比 CountDownLatch 更加复杂和强大。主要应用场景和 CountDownLatch 类似。 1.1 CyclicBarrier类    CyclicBarrier是java.util.concurrent包下面的一个工具类,字面意思是可循环使用(Cyclic)的屏障(Barrier),通过它可以实现让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,所有被屏障拦截的线程才会继续执行。 CyclicBarrier是一种同步机制,它可以使得一组线程在同一个障碍点进行等待。 CyclicBarriers 可以通过重置计数器从而重新使用。 CyclicBarrier支持一个可选的Runnable命令(实例化构造函数中的参数),该命令在最后一个线程到达后,但在任何线程被释放之前被执行。这一命令在barrier处只会被执行一次,且由最后到达的线程完成。这种屏障行为对于在任何一方继续之前更新共享状态都很有用。 all-or-none破损模型:如果一个线程因为中断(or执行过程的失败,超时等)过早的离开了barrier点

CountDownLatch,同步辅助类

≡放荡痞女 提交于 2020-01-13 09:59:45
public class CountDownLatchextends Object一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 假设定义一个计数器为 5。 每个线程完成任务后计数减1 计数器减为 0 则通知等待的线程。 用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用 CyclicBarrier。 CountDownLatch 是一个通用同步工具,它有很多用途。将计数 1 初始化的 CountDownLatch 用作一个简单的开/关锁存器,或入口:在通过调用 countDown() 的线程打开入口前,所有调用 await 的线程都一直在入口处等待。用 N 初始化的 CountDownLatch 可以使一个线程在 N 个线程完成某项操作之前一直等待,或者使其在某项操作完成 N 次之前一直等待。 CountDownLatch 的一个有用特性是,它不要求调用 countDown 方法的线程等到计数到达零时才继续,而在所有线程都能通过之前,它只是阻止任何线程继续通过一个 await。 根据API原话写个小Demo

CountDownLatch的基础使用

若如初见. 提交于 2020-01-13 02:26:03
在实际开发过程中,有一些需要并行执行的任务,通过CountDownLatch可以轻松实现这个功能,以下是初期使用的demo 1、先写两个线程类 import lombok.Data; import java.util.HashMap; import java.util.concurrent.CountDownLatch; @Data public class CountDownLatchThread1 implements Runnable{ private HashMap<String,Integer> countMap ; private CountDownLatch countDownLatch ; private Integer count = 0; public CountDownLatchThread1(HashMap<String,Integer> countMap, CountDownLatch countDownLatch) { this.countMap = countMap; this.countDownLatch = countDownLatch; } @Override public void run() { int count = (int)(Math.random()*(100)); countMap.put("num1",count); System

java多线程导入excel(poi)

让人想犯罪 __ 提交于 2020-01-12 11:36:04
导入excel util 1 /** 2 * @Description: excel导入工具类 3 4 * @Author: hg 5 6 * @CreateDate: 2019/6/4 11:58 7 8 */ 9 @SuppressWarnings("all") 10 public class POIUtil<T> { 11 12 private Logger logger = LoggerFactory.getLogger(this.getClass()); 13 14 private Workbook wb; 15 16 private String[] property; 17 18 private Class<T> c; 19 20 private String filePath; 21 22 private int startRow; 23 24 private int startColumn; 25 26 //是否需要hash 27 private boolean isHash = false; 28 29 //存放hash集合 30 private HashSet<Integer> hashSet; 31    32 private CopyOnWriteArrayList beanList; 33 34 public CopyOnWriteArrayList

信号量Semaphore,读写锁ReadWriteLock,计数器CountDownLatch,循环栅栏CyclicBarrier运用

不羁的心 提交于 2020-01-10 06:20:53
1.信号量Semaphore: 像synchronized, ReentrantLock等这些对临界区资源进行同步后,所有对临界区资源进行访问的线程都得串行排队,而信号量允许指定的线程数同时进行访问 demo: import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; public class TestSemaphore implements Runnable{ private static Semaphore semaphore = new Semaphore(5); //允许同时5个线程进行访问 不会阻塞 @Override public void run(){ try { semaphore.acquire(); System.out.println(System.currentTimeMillis() +" "+ Thread.currentThread().getName()); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); }finally { semaphore.release(

CountDownLatch使用

匆匆过客 提交于 2020-01-10 04:16:28
CountDownLatch 作用阻塞一个或多个线程等待其他线程完成操作。 定义初始化的时候,需要传入一个正数来初始化计数器**(0也可以,但这样定义没有实际意义) 。有两个方法 countDown()**用于递减计数器, await() 方法阻塞当前线程,直到计数器递减为 0 。 CountDownLatch 通常用于多个线程之间的协调工作。 假设有如下情节: 同时获取5张表的数据并一同返回 为了让cpu更好的得到利用,程序执行效率更高,使用多线程来完成。 public class CountDownLatchExample { // 循环次数 private static final int FOR_NUMBER = 5 ; public static void main ( String [ ] args ) { // 查询数据 for ( int i = 0 ; i < FOR_NUMBER ; i ++ ) { new Thread ( ( ) - > { System . out . println ( "查询第:\t" + Thread . currentThread ( ) . getName ( ) + "张表数据完成!" ) ; } , String . valueOf ( i ) ) . start ( ) ; } System . out . println

java并发实战:连接池实现

岁酱吖の 提交于 2020-01-09 23:52:19
池化技术简介 在我们使用数据库的过程中,我们往往使用数据库连接池而不是直接使用数据库连接进行操作,这是因为每一个数据库连接的创建和销毁的代价是昂贵的,而池化技术则预先创建了资源,这些资源是可复用的,这样就保证了在多用户情况下只能使用指定数目的资源,避免了一个用户创建一个连接资源,造成程序运行开销过大。 关于Java并发编程的总结和思考 连接池实现原理 这里只实现一个简易的连接池,更多复杂的需求可根据该连接池进行改进,该连接池主要参数如下: 一个繁忙队列busy 一个空闲队列idle 连接池最大活动连接数maxActive 连接池最大等待时间maxWait 连接池的活动连接数activeSize 程序流程图如下: 代码实现 泛型接口ConnectionPool.java public interface ConnectionPool<T> { /** * 初始化池资源 * @param maxActive 池中最大活动连接数 * @param maxWait 最大等待时间 */ void init(Integer maxActive, Long maxWait); /** * 从池中获取资源 * @return 连接资源 */ T getResource() throws Exception; /** * 释放连接 * @param connection 正在使用的连接 */

一文深入理解java中的线程

馋奶兔 提交于 2020-01-08 23:55:19
深入理解java中的线程 我们知道,一个线程可以用来执行一个任务,并且该任务的执行是异步的,并不会阻塞后面的代码。在一个java进程中,包含main方法的类也是在一个线程中执行的。在实际应用中,如果需要处理一个比较耗时的操作,为了不影响程序整体的响应,通常会将这个耗时的操作封装到一个线程中,异步的执行。但是,线程是怎样实现任务的异步执行的呢?本文将深入了解Thread类,以期望得出线程执行的秘密。 根据《深入理解JAVA虚拟机》中关于线程的章节,我们得知,在java中一个Thread对应着操作系统中的一个线程。而操作系统的线程是稀缺资源,不能无限制的创建线程,这也就是为什么要使用线程池的原因之一。 我们也知道,在java中要实现一个线程,有两种方式: 继承Thread类 实现Runnable接口 但是不管是哪种方式,最后线程的执行还是要通过调用Thread的start()方法 让我们看一下Thread类的重要属性和方法: // target就是一个传递给Thread等待Thread执行的Runnable对象 /* What will be run. */ private Runnable target; /* The group of this thread */ private ThreadGroup group; // 类方法,该方法会在Thread类初始化时,在类的构造器