countdownlatch

多线程(七、同步计数器-CountDownLatch)

落花浮王杯 提交于 2019-12-26 16:29:09
CountDownLatch是一个线程的同步计数器,主要有2个使用场景。 1、作为一个开关,N个子线程准备就绪,等待主线程的放行,然后子线程一起开始执行。 Task package com.jane; import java.util.concurrent.CountDownLatch; public class Task implements Runnable { private CountDownLatch countDownLatch; private String name; public Task(CountDownLatch countDownLatch, String name) { this.countDownLatch = countDownLatch; this.name = name; } @Override public void run() { try { System.out.println(name + "开始等待开关......"); countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(name + "执行任务完成"); } } 主线程 public class Main { public static

CountDownLatch类的使用

血红的双手。 提交于 2019-12-26 16:28:19
CountDownLatch介绍 JDk1.5提供了一个非常有用的包,Concurrent包,这个包主要用来操作一些并发操作,提供一些并发类,可以方便在项目当中傻瓜式应用。 JDK1.5以前,使用并发操作,都是通过Thread,Runnable来操作多线程;但是在JDK1.5之后,提供了非常方便的线程池(ThreadExecutorPool),主要代码由大牛Doug Lea完成,其实是在jdk1.4时代,由于java语言内置对多线程编程的支持比较基础和有限,所以他写了这个,因为实在太过于优秀,所以被加入到jdk之中。而本文要介绍的是Concurrent包下的CountDownLatch类。 CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。 构造器中的计数值(count)实际上就是闭锁需要等待的线程数量。这个值只能被设置一次

CountDownLatch和Cyclicbarrier概念、区别及原理

对着背影说爱祢 提交于 2019-12-26 16:27:51
CountDownLatch和Cyclicbarrier概念、区别及原理 1、概念   CountDownLatch:具有计数器的功能,等待其他线程执行完毕,主线程在继续执行,用于监听某些初始化操作,并且线程进行阻塞,等初始化执行完毕后,通知主线程继续工作执行。值得注意的是CountDownLatch计数的次数一定要与构造器传入的数字一致,比如构造器传入的是3,则countDown()一定要执行3次,否则线程将一直阻塞。CountDownLatch通常用来控制线程等待,它可以让线程等待倒计时结束,再开始执行。   CyclicBrrier:翻译过来就是循环栅栏的意思,其作用就是多线程的进行阻塞,等待某一个临界值条件满足后,同时执行!假设有一个场景:每个线程代表一个跑步运动员,当运动员都准备好后,才一起出发,只要有一个人没有准备好,大家都等待! 2、区别   CountDownLatch: 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行。   CyclicBrrier: N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。 3、Java 8 下源码分析 3.1 CountDownLatch源码 coutDownLatch 底层实现了QAS,具体源码后面再分析。 3.2 CyclicBrrier源码 来源: 51CTO 作者: a67god 链接:

深入剖析线程同步工具CountDownLatch原理

删除回忆录丶 提交于 2019-12-26 16:27:45
0 CountDownLatch的作用 CountDownLatch作为一个多线程间的同步工具,它允许一个或多个线程等待其他线程(可以是多个)完成工作后,再恢复执行。 就像下面这样: 1 从一个Demo说起 我们直接拿源码中给出的Demo看一下,源码中的这个demo可以看做模拟一个赛跑的场景。 赛跑肯定有跑得快的运动员也有跑的慢的运动员,每个运动员就表示一个线程。 运动员听到枪声后开始起跑,而最后一个运动员到达终点后,标志的比赛的结束。 整个过程如下图所示: CountDownLatch跑步模拟 源码如下所示 public class Race { private static final int N = 4; public static void main(String[] args) throws InterruptedException { CountDownLatch startSignal = new CountDownLatch(1); // 鸣枪开始信号 CountDownLatch doneSignal = new CountDownLatch(N); // 等待N个运动员都跑完后,比赛结束(结束信号) for (int i = 0; i < N; ++i) // N个运动员准备就绪,等待枪声 new Thread(new Runner(startSignal,

countDownLatch学习

故事扮演 提交于 2019-12-25 15:24:17
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 使用匿名内部类创建线程: new Thread(() -> { while (true) { try { Thread.sleep(3000); System.out.println("线程1开始执行…… ……"); } catch (Exception e) { e.printStackTrace(); } } }).start(); CountDownLatch测试 public static void main(String[] args) { final CountDownLatch latch = new CountDownLatch(2); System.out.println("主线程开始执行…… ……"); //第一个子线程执行 ExecutorService es1 = Executors.newSingleThreadExecutor(); es1.execute(() -> { try { Thread.sleep(3000); System.out.println("子线程:" + Thread.currentThread().getName() + "执行"); } catch (InterruptedException e) { e.printStackTrace(); }

第3章 JDK并发包(二)

大城市里の小女人 提交于 2019-12-25 02:10:38
3.1.2 重入锁的好搭档:Condition条件 它和wait()和notify()方法的作用是大致相同的。但是wait()和notify()方法是和synchronized关键字合作使用的,而Condition是与重入锁相关联的。通过Lock接口的Condition newCondition()方法可以生成一个与当前重入锁绑定的Condition实例。利用Condition对象,我们就可以让线程在合适的时间等待,或者在某一种特定的时刻得到通知,继续执行。 Condition接口提供的基本方法如下: void await() throws InterruptedException; void awaitUninterruptibly(); long awaitNanos(long nanosTimeout) throws InterruptedException; boolean await(long time, TimeUnit unit) throws InterruptedException; boolean awaitUntil(Date deadline) throws InterruptedException; void signal(); void signalAll(); 以上方法的含义如下: await()方法使当前线程等待,同时释放当前锁

04 JDK并发包相关类

北城余情 提交于 2019-12-25 02:09:38
1 Condition Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition的await()、signal()这种方式实现线程间协作更加安全和高效。Condition需要结合ReentrantLock使用。 Condition的优势是支持多路等待,即可以定义多个Condition,每个condition控制线程的一条执行通路,是对传统方式的优化。传统方式只能是一路等待。 方法名称 描述 await() 当前线程进入等待状态直到被通知(signal)或者中断; 当前线程进入运行状态并从await()方法返回的场景包括: (1)其他线程调用相同Condition对象的signal/signalAll方法,并且当前线程被唤醒; (2)其他线程调用interrupt方法中断当前线程; awaitUninterruptibly() 当前线程进入等待状态直到被通知,在此过程中对中断信号不敏感,不支持中断当前线程 awaitNanos(long) 当前线程进入等待状态,直到被通知、中断或者超时。如果返回值小于等于0,可以认定就是超时了 awaitUntil(Date) 当前线程进入等待状态,直到被通知、中断或者超时。如果没到指定时间被通知

Java多线程整理(li)

那年仲夏 提交于 2019-12-25 01:57:38
目录: 1.volatile变量 2.Java并发编程学习 3. CountDownLatch用法 4. CyclicBarrier使用 5.BlockingQueue使用 6.任务执行器Executor 7.CompletionService使用 8.ConcurrentHashMap使用 9.Lock使用 一、 volatile变量   1.volatile原理:volatile的原理实际上是告诉处理器,不要把变量缓存在寄存器或者相对于其他处理器不可见的地方,而是把变量放在主存,每次读写操作都在主存上进行操作。另外,被申明为volatile的变量也不会与其它内存中的变量进行重排序。   2.volatile同步:volatile是同步的一个子集,只保证了变量的可见性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。相对于同步而言,volatile的优势:a.简易性,可以像使用其他变量一样使用volatile变量;b.volatile变量不会造成线程阻塞; c. 如果读操作远远大于写操作,volatile 变量还可以提供优于锁的性能优势 。   3.正确使用volatile条件:对变量的写操作不依赖于当前值;该变量没有包含在具有其他变量的不变式中; /* * 对于第一条原则:对变量的写操作不依赖于当前值; * 虽然i++只有一条语句

线程池的使用

旧城冷巷雨未停 提交于 2019-12-25 00:16:07
线程池 线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务。 线程池的使用 ThreadPoolExecutor创建线程池,参数很多,由于可以显示指定队列的大小,所以可以合理避免OOM (1)corePoolSize:保持在池中的线程数量,如果没有设置 (2)allowCoreThreadTimeout参数,即使这些线程空闲也将一直保持在池中 (3)maximumPoolSize:线程池中的最大线程数量 (4)keepAliveTime:当线程池中空闲线程数量超过corePoolSize时,多余的线程会超过这个保活时间会被销毁; (5)unit:keepAliveTime的单位 (6)workQueue:任务队列,被添加到线程池中,但尚未被执行的 任务;它一般分为直接提交队列、有界任务队列、无界任务队 列、优先任务队列几种; (7)threadFactory:线程工厂,用于创建线程,一般用默认即可; (8)handler:拒绝策略;当任务太多来不及处理时,如何拒绝任务,有4个策略: ThreadPoolExecutor.AbortPolicy():抛出java

闭锁CountDownLatch和栅栏CyclicBarrier之异同举例

为君一笑 提交于 2019-12-24 20:05:12
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> CountDownLatch和CyclicBarrier的主要联系和区别如下: 1.闭锁CountDownLatch做减计数,而栅栏CyclicBarrier则是加计数。 2.CountDownLatch是一次性的,CyclicBarrier可以重用。 3.CountDownLatch强调一个线程等多个线程完成某件事情。CyclicBarrier是多个线程互等,等大家都完成。 4.鉴于上面的描述,CyclicBarrier在一些场景中可以替代CountDownLatch实现类似的功能。 另外,值得一提的是,CountDownLatch和CyclicBarrier在创建和启动线程时,都没有明确提到同时启动全部线程,事实上这在技术上是不大可能,不必要,不提倡的。 先看例子一: class SubRunnable implements Runnable { private CountDownLatch begin, end; private List<Integer> sublist; public SubRunnable(List<Integer> sublist, CountDownLatch begin,CountDownLatch end) { this.sublist = sublist; this