【多线程】用阻塞队列实现等待唤醒机制(Java实现)
本文讲解一下 用阻塞队列实现等待唤醒机制,一路同行的小伙伴,如果对你有帮助,点赞、收藏、关注,谢谢~
1.什么是等待-唤醒机制?
是多线程编程中 线程间通信的重要方式。
它允许线程在特定条件下主动等待,并在条件满足时被其他线程唤醒。
- 一个线程检查某个条件,如果不满足就进入等待状态(阻塞)
- 另一个线程修改条件后,通知(唤醒) 等待的线程
- 被唤醒的线程重新检查条件,如果满足就继续执行
2.为什么需要这种机制?
- 避免忙等待(不断循环检查条件),节省CPU资源
- 实现线程间的协调配合
- 解决生产者-消费者等经典并发问题
3.用阻塞队列实现等待唤醒机制Demo:
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;public class ProducerConsumerDemo {public static void main(String[] args) {// 创建一个容量为3的阻塞队列BlockingQueue<String> queue = new ArrayBlockingQueue<>(3);// 生产者线程Thread producer = new Thread(() -> {try {for (int i = 1; i <= 5; i++) {String item = "Item-" + i;queue.put(item); // 将数据放入队列System.out.println("生产: " + item);Thread.sleep(500); // 模拟生产耗时}} catch (InterruptedException e) {Thread.currentThread().interrupt();}});// 消费者线程Thread consumer = new Thread(() -> {try {for (int i = 1; i <= 5; i++) {String item = queue.take(); // 从队列取出数据System.out.println("消费: " + item);Thread.sleep(1000); // 模拟消费耗时}} catch (InterruptedException e) {Thread.currentThread().interrupt();}});// 启动线程producer.start();consumer.start();}
}
3.1阻塞队列的作用:
BlockingQueue是一个线程安全的队列。
- 当队列满时,
put()
操作会阻塞生产者线程,直到队列有空位 - 当队列空时,
take()
操作会阻塞消费者线程,直到队列有新元素
3.2生产者线程逻辑:
-
queue.put(item): 尝试将item放入队列
- 如果队列未满,直接放入
- 如果队列已满,线程会被阻塞,直到队列有空位
-
Thread.sleep(500): 模拟生产每个item需要500ms
3.3消费者线程逻辑:
-
queue.take():尝试从队列取出元素
- 如果队列不为空,直接取出
- 如果队列为空,现成会被阻塞,直到队列有新元素
-
Thread.sleep(1000):模拟消费每个item需要1000ms
反正
生产者不需要关心消费者是否存在,只需往队列放数据
消费者不需要关心生产者是否存在,只需从队列取数据
阻塞队列自动处理了线程间的等待和唤醒,简化了并发编程
以上例子就是用阻塞队列实现等待唤醒机制,生产者存数据,消费者取数据。阻塞队列负责数据的暂时存储,处理线程的等待和唤醒。
如果对小伙伴有帮助,可以点赞、收藏、关注,谢谢~