1、CountDownLatch:减法计数器

代码实例

public class CountDownLatchTest {
public static void main(String[] args) {
//优先执行,执行完毕之后,才能执行 main
//1、实例化计数器,100
CountDownLatch countDownLatch = new CountDownLatch(100);
new Thread(()->{
for (int i = 0; i < 100; i++) {
System.out.println("++++++++++Thread");
countDownLatch.countDown();
}
}).start();


//2、调用 await 方法 让主线程等待countdonwn运行完毕
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}

for (int i = 0; i < 100; i++) {
System.out.println("main--------------");
}
}
}

countDown() 计数器减一

await() 计数器停止,唤醒其他线程

new CountDownLatch(100)、coutDown()、await() 必须配合起来使用,创建对象时赋的值是多少,coutDown() 就要执行多少次,否则计数器不会清零,计数器就不会停止后,其他线程无法唤醒。

2、CyclicBarrier:加法计数器

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierTest {
public static void main(String[] args) {
//定义一个计数器,当计数器的值累加到10,输出"放行"
CyclicBarrier cyclicBarrier = new CyclicBarrier(30,()->{
System.out.println("放行");
});

for (int i = 1; i <= 90; i++) {
final int temp = i;

new Thread(()->{
System.out.println("-->"+temp);

try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}).start();

}
}
}

await() 执行 CyclicBarrier 的业务,CyclicBarrier 中的 Runnable 执行一次之后,计数器清零,等待下一次执行。

3、Semaphore:计数信号量

实际开发中主要用来做限流操作,即限制可以访问某些资源的线程数量。

  • 初始化

  • 获取许可

  • 释放许可

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

public class SemaphoreTest {
public static void main(String[] args) {
//同时只能进5个人
Semaphore semaphore = new Semaphore(5);
for (int i = 0; i < 15; i++) {
new Thread(()->{
try {
//获得许可
semaphore.acquire();
System.out.println(Thread.currentThread().getName()+"进店购物");
TimeUnit.SECONDS.sleep(5);
System.out.println(Thread.currentThread().getName()+"出店");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
//释放许可
semaphore.release();
}
},String.valueOf(i)).start();
}
}
} acquire():等待
获取许可,如果没有名额,则等待。

release():释放许可,并且唤醒等待的线程。

并发编程-JUC的三个常用工具类的更多相关文章

  1. Java并发编程阅读笔记-同步容器、工具类整理

  2. JavaEE编程实验 实验1 Java常用工具类编程(未完成)

    1.使用String类分割split将字符串“Solutions to selected exercises can be found in the electronic document The T ...

  3. [书籍翻译] 《JavaScript并发编程》第三章 使用Promises实现同步

    本文是我翻译<JavaScript Concurrency>书籍的第三章 使用Promises实现同步,该书主要以Promises.Generator.Web workers等技术来讲解J ...

  4. JavaEE-实验一 Java常用工具类编程

    该博客仅专为我的小伙伴提供参考而附加,没空加上代码具体解析,望各位谅解 1.  使用类String类的分割split 将字符串  “Solutions to selected exercises ca ...

  5. 并发编程之第三篇(synchronized)

    并发编程之第三篇(synchronized) 3. 自旋优化 4. 偏向锁 撤销-其它线程使用对象 撤销-调用wait/notify 批量重偏向 批量撤销 5. 锁消除 4.7 wait/notify ...

  6. java并发编程笔记(三)——线程安全性

    java并发编程笔记(三)--线程安全性 线程安全性: ​ 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现 ...

  7. 【Java并发基础】并发编程领域的三个问题:分工、同步和互斥

    前言 可以将Java并发编程抽象为三个核心问题:分工.同步和互斥. 这三个问题的产生源自对性能的需求.最初时,为提高计算机的效率,当IO在等待时不让CPU空闲,于是就出现了分时操作系统也就出现了并发. ...

  8. 浅谈集合框架三、Map常用方法及常用工具类

    最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...

  9. java常用工具类(三)

    一.连接数据库的综合类 package com.itjh.javaUtil; import java.sql.Connection; import java.sql.DriverManager; im ...

  10. JUC源码分析-其它工具类(一)ThreadLocalRandom

    JUC源码分析-其它工具类(一)ThreadLocalRandom ThreadLocalRandom 是 JDK7 在 JUC 包下新增的随机数生成器,它解决了 Random 在多线程下多个线程竞争 ...

随机推荐

  1. 【JAVA基础】日志管理

    LOGGER.debug("Request uri: {}, headers: {}", signedRequest.getURI(), signedRequest.getAllH ...

  2. Codeforces Round #728 (Div. 2) A~C 补题记录

    比赛链接:Here 1541A. Pretty Permutations 给定 \(1,2,3,4,...n\) 序列,让每一个数字都不处于原来的位置,但总的移动距离要最小 \(n\) 为偶数的情况 ...

  3. 《深入理解计算机系统》(CSAPP)读书笔记 —— 第六章 存储器层次结构

      在计算机系统模型中,CPU执行指令,而存储器系统为CPU存放指令和数据.实际上,存储器系统是一个具有不同容量.成本和访问时间的存储设备的层次结构.   如果你的程序需要的数据是存储在CPU寄存器中 ...

  4. S3C2440移植uboot之编译烧写uboot

    目录 移植环境 获取uboot 更新交叉编译工具 配置环境变量 移植环境 主 机:VMWare--ubuntu16.04 开发板:S3C2440 编译器:arm-linux-gcc-4.3.2.tgz ...

  5. java基础-数组-day06

    1. 引入数组 录入10个学生的成绩 求和 求平均 import java.util.Scanner; public class TestArray01{ public static void mai ...

  6. GO 指针数据类型的使用

    转载请注明出处: 在Go语言中,指针类型允许直接访问和修改某个变量的内存地址.通过使用指针,我们可以在函数之间共享数据或者在函数内部修改外部变量的值. 以下是关于Go语言指针类型的一些重要语法和示例: ...

  7. 域名解析类型及dig,nslookup进行Dns解析过程查看

    本文为博主原创,未经允许不得转载: 通常我们在windows系统下查看域名是不是可以正常访问,是通过cmd命令打开dos窗口,使用ping 命令来查看域名是不是可以正常访问,使用 ping 命令正常访 ...

  8. Java之利用openCsv导出csv文件

    当时导入的时候用的openCsv,那么导出的时候自然也是用这个,查了好多资料才找到解决方案,下面记录一下实现过程. 1.Controller层: /** * 导出csv文件 */ @RequestMa ...

  9. Linux 常见重要系统文件

    Linux 常见重要系统文件 目录 Linux 常见重要系统文件 网卡配置文件 文件内容举例: DNS配置文件 文件内容举例: 系统hosts文件 文件内容举例: fstab文件 文件内容举例: rc ...

  10. 在Vue中可以使用方括号法获得想要的对象数据吗?

    1.问题 Document {{message}} {{school.name}}{{school[mobile]}} 在这里 {{school.name}}{{school[mobile]}} 不可 ...