Java线程:堵塞队列与堵塞栈

简介: 一、堵塞队列   Java定义了堵塞队列的接口java.util.concurrent.BlockingQueue,堵塞队列是一个指定长度的队列,当试图向队列中添加元素而队列已满,或者是想从队列移出元素而队列为空的时候,堵塞队列导致线程堵塞。

一、堵塞队列

  Java定义了堵塞队列的接口java.util.concurrent.BlockingQueue,堵塞队列是一个指定长度的队列,当试图向队列中添加元素而队列已满,或者是想从队列移出元素而队列为空的时候,堵塞队列导致线程堵塞。

  在协调多个线程之间的合作时,堵塞队列是一个有用的工具。

  堵塞队列的方法分为三类,取决于当队列满或空时它们的相应方式。

    1、如果将队列当作线程管理工具使用,用到put()(添加一个元素)和take()(移出并返回头元素)方法。

    2、当试图向满的队列中添加或从从空的队列中移出元素时,用到add()、remove()(移出并返回头元素)、element()(返回队列的头元素)。

    3、在一个线程中,队列会在任何时候空或满时,用offer()(添加一个元素并返回true)、poll()(移出并返回队列的头元素)、peek()(返回队列的头元素)替代。这些方法如果不能完成任务,不会抛出异常,只会给出一个错误。

简单的例子:

  QueueTest.java

 1 package Thread;
 2 
 3 import java.util.concurrent.ArrayBlockingQueue;
 4 import java.util.concurrent.BlockingQueue;
 5 
 6 public class QueueTest {
 7     public static void main(String[] args)throws InterruptedException{
 8         BlockingQueue bqueue=new ArrayBlockingQueue(20);
 9         for (int i=0;i<30;i++){
10             bqueue.put(i);
11             System.out.println("向堵塞队列中添加了元素:"+i);
12         }
13         System.out.println("程序运行结束,即将退出---");
14     }
15 }
View Code

  结果为:

 1 向堵塞队列中添加了元素:0
 2 向堵塞队列中添加了元素:1
 3 向堵塞队列中添加了元素:2
 4 向堵塞队列中添加了元素:3
 5 向堵塞队列中添加了元素:4
 6 向堵塞队列中添加了元素:5
 7 向堵塞队列中添加了元素:6
 8 向堵塞队列中添加了元素:7
 9 向堵塞队列中添加了元素:8
10 向堵塞队列中添加了元素:9
11 向堵塞队列中添加了元素:10
12 向堵塞队列中添加了元素:11
13 向堵塞队列中添加了元素:12
14 向堵塞队列中添加了元素:13
15 向堵塞队列中添加了元素:14
16 向堵塞队列中添加了元素:15
17 向堵塞队列中添加了元素:16
18 向堵塞队列中添加了元素:17
19 向堵塞队列中添加了元素:18
20 向堵塞队列中添加了元素:19
View Code

二、栈

  对于堵塞栈,与堵塞队列相似,不同点是后入先出的结构,每次操作的都是栈顶,而队列是先进先出的结构,每次操作的对列头。堵塞栈定义了新街口java.util.concurrentBlockingDeque。例子:

  DequeTest.java

 1 package Thread;
 2 import java.util.concurrent.BlockingDeque;
 3 import java.util.concurrent.LinkedBlockingDeque;
 4 public class QueueTest {
 5     public static void main(String[] args)throws InterruptedException{
 6         BlockingDeque bqueue=new LinkedBlockingDeque(20);
 7         for (int i=0;i<30;i++){
 8             bqueue.put(i);
 9             System.out.println("向堵塞队列中添加了元素:"+i);
10         }
11         System.out.println("程序运行结束,即将退出---");
12     }
13 }
View Code

  结果为:

 1 向堵塞栈中添加了元素:0
 2 向堵塞栈中添加了元素:1
 3 向堵塞栈中添加了元素:2
 4 向堵塞栈中添加了元素:3
 5 向堵塞栈中添加了元素:4
 6 向堵塞栈中添加了元素:5
 7 向堵塞栈中添加了元素:6
 8 向堵塞栈中添加了元素:7
 9 向堵塞栈中添加了元素:8
10 向堵塞栈中添加了元素:9
11 向堵塞栈中添加了元素:10
12 向堵塞栈中添加了元素:11
13 向堵塞栈中添加了元素:12
14 向堵塞栈中添加了元素:13
15 向堵塞栈中添加了元素:14
16 向堵塞栈中添加了元素:15
17 向堵塞栈中添加了元素:16
18 向堵塞栈中添加了元素:17
19 向堵塞栈中添加了元素:18
20 向堵塞栈中添加了元素:19
View Code

 

当神已无能为力,那便是魔渡众生
目录
相关文章
|
5天前
|
数据采集 存储 Java
高德地图爬虫实践:Java多线程并发处理策略
高德地图爬虫实践:Java多线程并发处理策略
|
3天前
|
设计模式 安全 Java
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
|
5天前
|
安全
python_threading多线程、queue安全队列
python_threading多线程、queue安全队列
12 2
|
1天前
|
消息中间件 监控 安全
【JAVAEE学习】探究Java中多线程的使用和重点及考点
【JAVAEE学习】探究Java中多线程的使用和重点及考点
|
1天前
|
安全 Java 开发者
构建高效微服务架构:后端开发的新范式Java中的多线程并发编程实践
【4月更文挑战第29天】在数字化转型的浪潮中,微服务架构已成为软件开发的一大趋势。它通过解耦复杂系统、提升可伸缩性和促进敏捷开发来满足现代企业不断变化的业务需求。本文将深入探讨微服务的核心概念、设计原则以及如何利用最新的后端技术栈构建和部署高效的微服务架构。我们将分析微服务带来的挑战,包括服务治理、数据一致性和网络延迟问题,并讨论相应的解决方案。通过实际案例分析和最佳实践的分享,旨在为后端开发者提供一套实施微服务的全面指导。 【4月更文挑战第29天】在现代软件开发中,多线程技术是提高程序性能和响应能力的重要手段。本文通过介绍Java语言的多线程机制,探讨了如何有效地实现线程同步和通信,以及如
|
3天前
|
安全 Java
【JAVA】线程的run()和start()有什么区别?
【JAVA】线程的run()和start()有什么区别?
|
4天前
|
缓存 Java
Java并发编程:深入理解线程池
【4月更文挑战第26天】在Java中,线程池是一种重要的并发工具,它可以有效地管理和控制线程的执行。本文将深入探讨线程池的工作原理,以及如何使用Java的Executor框架来创建和管理线程池。我们将看到线程池如何提高性能,减少资源消耗,并提供更好的线程管理。
|
5天前
|
Java UED
Java并发编程:理解并应用线程池
【4月更文挑战第25天】在处理并发问题时,线程池是Java中一种重要的工具。本文将探讨线程池的概念、优势以及如何在Java程序中有效地使用它。我们将详细解释线程池的工作原理,并通过示例来使其更加易于理解。
|
5天前
|
监控 Java 调度
Java多线程实战-从零手搓一个简易线程池(四)线程池生命周期状态流转实现
Java多线程实战-从零手搓一个简易线程池(四)线程池生命周期状态流转实现
|
5天前
|
设计模式 Java
Java多线程实战-从零手搓一个简易线程池(三)线程工厂,核心线程与非核心线程逻辑实现
Java多线程实战-从零手搓一个简易线程池(三)线程工厂,核心线程与非核心线程逻辑实现