首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第一章:相关概念
1.1 并发和并行
1.2 进程和线程
1.3 线程调度
1.4 多线程的应用场景
第二章:线程的创建和使用
2.1 概述
2.1 JDK 5之前创建线程的方式
2.1.1 概述
2.1.2 继承 Thread 类
2.1.3 实现 Runnable 接口
2.1.4 继承方式和实现方式的区别
2.2 设置线程名称和获取线程名称
2.3 线程的优先级
第三章:线程安全
3.1 售票程序引出线程安全
3.2 线程安全的原因
3.3 线程安全的解决方法
3.4 JDK 5 之前解决线程安全
3.4.1 概述
3.4.2 同步机制的原理
3.4.3 同步机制中的锁
3.4.4 应用示例
3.5 JDK 5 之后解决线程安全
3.6 死锁
3.7 synchronized 与 Lock 的对比
第四章:线程通信
4.1 为什么需要线程通信?
4.2 等待唤醒机制
4.3 生产者和消费者问题
4.4 sleep() 和 wait() 方法的区别
4.5 生产者和消费者性能问题
4.6 Lock 接口的深入
第五章:单例设计模式
5.1 概述
5.2 单例模式
第六章:线程池
6.1 概述
6.2 线程池相关的API
6.3 实现 Callable 接口
6.4 ThreadPoolExecutor
第七章:线程的生命周期
第八章:volatile 关键字
8.1 概述
8.2 应用示例
第九章:原子性
9.1 概述
9.2 AtomicInteger
9.2.1 常用方法
9.2.2 原理
9.2.3 源码解析
9.3 synchronized 和 CAS 的区别
第十章:并发工具类
10.1 Hashtable
10.2 ConcurrentHashMap
10.3 CountDownLatch
10.4 Semaphore
当前位置:
首页>>
技术小册>>
Java语言基础8-Java多线程
小册名称:Java语言基础8-Java多线程
CountDownLatch 的应用场景:让某一条线程等待其它线程执行完毕之后再执行。 构造方法: ```bash // count表示等待线程数量,底层定义了一个计数器 public CountDownLatch(int count) {} ``` 让线程等待: ```bash // 当计数器为0的时候,会唤醒等待的线程 public void await() throws InterruptedException {} ``` 当前线程执行完毕: ```bash // 线程执行完毕时调用,会将计数器-1 public void countDown() {} ``` 示例:模拟妈妈等待孩子吃完饭之后才收拾碗筷 ```bash package com.github.demo19; import java.util.concurrent.CountDownLatch; /** * @author maxiaoke.com * @version 1.0 * */ public class MotherThread extends Thread { private CountDownLatch countDownLatch; public MotherThread(CountDownLatch countDownLatch) { this.countDownLatch = countDownLatch; } @Override public void run() { // 等待 try { this.countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } // 收拾碗筷 System.out.println(Thread.currentThread().getName() + "收拾碗筷"); } } ``` ```bash package com.github.demo19; import java.util.concurrent.CountDownLatch; /** * @author maxiaoke.com * @version 1.0 * */ public class SonThread1 extends Thread { private CountDownLatch countDownLatch; public SonThread1(CountDownLatch countDownLatch) { this.countDownLatch = countDownLatch; } @Override public void run() { // 吃饭 for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + "吃了第" + (i + 1) + "个饺子"); } // 告诉妈妈吃完了 this.countDownLatch.countDown(); } } ``` ```bash package com.github.demo19; import java.util.concurrent.CountDownLatch; /** * @author maxiaoke.com * @version 1.0 * */ public class SonThread2 extends Thread { private CountDownLatch countDownLatch; public SonThread2(CountDownLatch countDownLatch) { this.countDownLatch = countDownLatch; } @Override public void run() { // 吃饭 for (int i = 0; i < 20; i++) { System.out.println(Thread.currentThread().getName() + "吃了第" + (i + 1) + "个饺子"); } // 告诉妈妈吃完了 this.countDownLatch.countDown(); } } ``` ```bash package com.github.demo19; import java.util.concurrent.CountDownLatch; /** * @author maxiaoke.com * @version 1.0 * */ public class SonThread3 extends Thread { private CountDownLatch countDownLatch; public SonThread3(CountDownLatch countDownLatch) { this.countDownLatch = countDownLatch; } @Override public void run() { // 吃饭 for (int i = 0; i < 30; i++) { System.out.println(Thread.currentThread().getName() + "吃了第" + (i + 1) + "个饺子"); } // 告诉妈妈吃完了 this.countDownLatch.countDown(); } } ``` ```bash package com.github.demo19; import java.util.concurrent.CountDownLatch; /** * @author maxiaoke.com * @version 1.0 * */ public class Test { public static void main(String[] args) { // CountDownLatch的对象,需要传递给四个线程 CountDownLatch countDownLatch = new CountDownLatch(3); // 创建四个线程对象并开启它们 MotherThread motherThread = new MotherThread(countDownLatch); motherThread.setName("妈妈"); SonThread1 sonThread1 = new SonThread1(countDownLatch); sonThread1.setName("孩子1"); SonThread2 sonThread2 = new SonThread2(countDownLatch); sonThread2.setName("孩子2"); SonThread3 sonThread3 = new SonThread3(countDownLatch); sonThread3.setName("孩子3"); // 启动线程 motherThread.start(); sonThread2.start(); sonThread3.start(); sonThread1.start(); } } ```
上一篇:
10.2 ConcurrentHashMap
下一篇:
10.4 Semaphore
该分类下的相关小册推荐:
Mybatis合辑4-Mybatis缓存机制
Java必知必会-Maven初级
Java必知必会-Maven高级
SpringBoot合辑-初级篇
Java语言基础15-单元测试和日志技术
深入理解Java虚拟机
Java语言基础14-枚举和注解
Java语言基础16-JDK8 新特性
Mybatis合辑5-注解、扩展、SQL构建
Java语言基础7-Java中的异常
Java语言基础6-面向对象高级
Java并发编程