countdownlatch

java并发包CountDownLatch

大城市里の小女人 提交于 2019-12-19 23:57:11
CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。 这里举个例子: 比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。 代码如下: package com . newDemo . controller . test ; import java . util . concurrent . CountDownLatch ; public class threadDemo21 { public static void main ( String [ ] args ) throws InterruptedException { System . out . println ( "等待子线程执行完毕..." ) ; final CountDownLatch countDownLatch = new CountDownLatch ( 2 ) ; Thread t1 = new Thread ( new Runnable ( ) { public void run ( ) { System . out . println ( "子线程," + Thread . currentThread ( ) . getName ( ) + "开始执行..." ) ;

java并发操作

旧时模样 提交于 2019-12-18 06:57:28
项目中常用的java并发操作 一、java8新特性java并发流操作(结合纳姆达表达式) List<String> list = new ArrayList<>(); list..stream().parallel().forEach(list1 ->{   // 调用方法 method }); 注:其中list1为list一个子集。然后通过java流(steam)操作并发(parellel),同时开启多个线程去执行方法(method); 所以当一个线程执行完成之后会继续执行集合中另外的子集,直到list循环结束。 二、采用阻塞队列的形式   1、List<Qcbatch> qcBatchList = new ArrayList<>();   注:QcBatch 为一个对象,此处为一个示例,然后在qcBatchList 集合中放入自己的元素   2、// 创建阻塞队列跑批   ConcurrentLinkedQueue<QcBatch> queue = new ConcurrentLinkedQueue<>(); // 线程同步的队列   queue.addAll(qcBatchList );   int count = 10; // 此处为设置线程数位10   final CountDownLatch countDownLatch = new CountDownLatch

Flexible CountDownLatch?

别说谁变了你拦得住时间么 提交于 2019-12-17 22:15:26
问题 I have encountered a problem twice now whereby a producer thread produces N work items, submits them to an ExecutorService and then needs to wait until all N items have been processed. Caveats N is not known in advance . If it were I would simply create a CountDownLatch and then have producer thread await() until all work was complete. Using a CompletionService is inappropriate because although my producer thread needs to block (i.e. by calling take() ) there's no way of signalling that all

Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore

那年仲夏 提交于 2019-12-17 01:31:07
原文出处: 海子 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法。 以下是本文目录大纲: 一.CountDownLatch用法 二.CyclicBarrier用法 三.Semaphore用法 一.CountDownLatch用法 CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。 CountDownLatch类只提供了一个构造器: public CountDownLatch(int count) { }; //参数count为计数值 然后下面这3个方法是CountDownLatch类中最重要的方法: public void await() throws InterruptedException { }; //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行 public boolean await(long timeout, TimeUnit unit) throws InterruptedException { }; /

多线程并发工具类

流过昼夜 提交于 2019-12-17 00:46:19
多线程并发工具类 CountDownLatch,CyclicBarrier,Semaphore,Exchanger CountDownLatch CountDownLatch,用于一个或多个线程等待其他线程完成操作。构造器中的计数值(count)实际上就是闭锁需要等待的线程数量。这个值只能被设置一次,主线程在启动其他线程后立即调用CountDownLatch.await()方法。这样主线程的操作就会在这个方法上阻塞,直到其他线程完成各自的任务。 听到这样的描述,相信有很多读者联想到了join方法,join的工作原理是,不停检查thread是否存活,如果存活则让当前线程永远wait,直到thread线程终止,线程的this.notifyAll 就会被调用。但是join与CountDownLatch还是存在着不少区别。join必须等到整个线程结束才行,但是CountDownLatch只要等到某一条件达成即可: public class JoinWord implements Runnable{ @Override public void run() { System.out.println(Thread.currentThread().getName()+“first work”); } } public class JoinTest { public static void main

并发库:同步工具类

限于喜欢 提交于 2019-12-16 06:17:58
1、Semaphore计数信号量 Semaphore计数信号量维护了一个许可集,用于限制访问某些资源的线程数目,并提供同步机制。 通俗来说,就是可以控制让多个线程拿到许可,拿到许可的线程可以并发管理同一个资源,这些拿到许可的线程可以看做一个整体。 如果是单个信号量的Semaphore对象,就可以实现互斥锁的功能,而且,可以由一个线程获得许可,另一个线程去释放许可。可以应用于死锁恢复的一些场合。 创建信号量对象 第二个构造的第二个参数表示当有一个许可被释放之后,替补的线程是以什么方式去拿到这个许可,如果为true,则表示是公平的,谁先来谁上;false表示是竞争上岗。 让线程获取许可 在线程内调用Semaphore对象的acquire方法,从此信号量中获取一个许可。 让线程释放许可 在线程内调用Semaphore对象的release方法,来释放一个许可。 获取可用的许可数 2、CyclicBarrier 一个同步辅助类,它要求一组线程互相等待,直到全部到达某个公共屏障点。还可以设置全部到齐之后再去做什么事情。 两个构造方法如下: 设置公共屏障点 3、CountDownLatch 类似倒计时计数器,调用CountDownLatch的countDown方法将计数器减1,当计数到达0时,所有等待的线程开始执行。 CountDownLatch类的等待方法 4、Exchanger

volatile关键字最详细介绍

别等时光非礼了梦想. 提交于 2019-12-15 12:45:00
目录 1 保证共享变量在多线程之间的可见性(内存可见性) 2 禁止指令重排 3 不保证原子性 1 保证共享变量在多线程之间的可见性(内存可见性) 如上图所示,所有线程的共享变量都存储在主内存中,每一个线程都有一个独有的工作内存,每个线程不直接操作在主内存中的变量,而是将主内存上变量的副本放进自己的工作内存中,只操作工作内存中的数据。当修改完毕后,再把修改后的结果放回到主内存中。每个线程都只操作自己工作内存中的变量,无法直接访问对方工作内存中的变量,线程间变量值的传递需要通过主内存来完成。 上述的Java内存模型在单线程的环境下不会出现问题,但在多线程的环境下可能会出现脏数据,例如:如果有AB两个线程同时拿到变量i,进行递增操作。A线程将变量i放到自己的工作内存中,然后做+1操作,然而此时,线程A还没有将修改后的值刷回到主内存中,而此时线程B也从主内存中拿到修改前的变量i,也进行了一遍+1的操作。最后A和B线程将各自的结果分别刷回到主内存中,看到的结果就是变量i只进行了一遍+1的操作,而实际上A和B进行了两次累加的操作,于是就出现了错误。究其原因,是因为线程B读取到了变量i的脏数据的缘故。 此时如果对变量i加上volatile关键字修饰的话,它可以保证当A线程对变量i值做了变动之后,会立即刷回到主内存中,而其它线程读取到该变量的值也作废,强迫重新从主内存中读取该变量的值

CountDownLatch、Semaphore等4大并发工具类详解

青春壹個敷衍的年華 提交于 2019-12-14 07:18:31
Java并发工具包 1.并发工具类 提供了比synchronized更加高级的各种同步结构:包括CountDownLatch、CyclicBarrier、Semaphore等,可以实现更加丰富的多线程操作。 2.并发容器 提供各种线程安全的容器:最常见的ConcurrentHashMap、有序的ConcurrentSkipListMap,实现线程安全的动态数组CopyOnWriteArrayList等。 3.并发队列 各种BlockingQueue的实现:常用的ArrayBlockingQueue、SynchorousQueue或针对特定场景的PriorityBlockingQueue。 4.Executor框架 可以创建各种不同类型的线程池,调度任务运行等,绝大部分情况下,不再需要自己从头实现线程池和任务调度器。 Java常用的并发容器 1.ConcurrentHashMap 经常使用的并发容器,JDK 1.7和1.8的底层数据结构发生了变化(后续文章会详解),这里可以建议学习顺序如下:从Java7 HashMap -> Java7 ConcurrentHashMap -> Java8 HashMap -> Java8 ConcurrentHashMap,这样可以更好的掌握这个并发容器,毕竟都是从HashMap进化而来。 2.ConcurrentSkipListMap 在乎顺序

Can I control order of thread execution with CountDownLatch?

烈酒焚心 提交于 2019-12-13 19:49:59
问题 I have task to do. I have to create 4 services A,B,C and D. Each service should have his own thread. A service should only start after all the services that it depends on are started and A service should only stop after all the services that depend on it are stopped. Services should be started and stopped in parallel whenever possible. Services B and C depend on Service A Service D depends on Service B To start service D, service A and B need to be started To stop service A, service B, D and

Why the overall performance of application degrades if I do null checks on the maps?

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-13 08:07:40
问题 Below is my class which uses CountDownLatch to make sure reads are not happening on the primary, secondary and tertiary maps for the first time whenever writes are happening on those maps. public class ClientData { public static class Mappings { public final Map<String, Map<Integer, String>> primary; public final Map<String, Map<Integer, String>> secondary; public final Map<String, Map<Integer, String>> tertiary; public Mappings( Map<String, Map<Integer, String>> primary, Map<String, Map