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

 

当神已无能为力,那便是魔渡众生
目录
相关文章
|
8天前
|
存储 Java 数据库连接
java多线程之线程通信
java多线程之线程通信
|
9天前
|
安全 Java 开发者
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第9天】本文将深入探讨Java并发编程的核心概念,包括线程安全和性能优化。我们将详细解析Java中的同步机制,包括synchronized关键字、Lock接口以及并发集合等,并探讨它们如何影响程序的性能。此外,我们还将讨论Java内存模型,以及它如何影响并发程序的行为。最后,我们将提供一些实用的并发编程技巧和最佳实践,帮助开发者编写出既线程安全又高效的Java程序。
22 3
|
12天前
|
Java 调度
Java并发编程:深入理解线程池的原理与实践
【4月更文挑战第6天】本文将深入探讨Java并发编程中的重要概念——线程池。我们将从线程池的基本原理入手,逐步解析其工作过程,以及如何在实际开发中合理使用线程池以提高程序性能。同时,我们还将关注线程池的一些高级特性,如自定义线程工厂、拒绝策略等,以帮助读者更好地掌握线程池的使用技巧。
|
12天前
|
设计模式 安全 Java
Java并发编程实战:使用synchronized关键字实现线程安全
【4月更文挑战第6天】Java中的`synchronized`关键字用于处理多线程并发,确保共享资源的线程安全。它可以修饰方法或代码块,实现互斥访问。当用于方法时,锁定对象实例或类对象;用于代码块时,锁定指定对象。过度使用可能导致性能问题,应注意避免锁持有时间过长、死锁,并考虑使用`java.util.concurrent`包中的高级工具。正确理解和使用`synchronized`是编写线程安全程序的关键。
|
10天前
|
Java
Java 并发编程:深入理解线程池
【4月更文挑战第8天】本文将深入探讨 Java 中的线程池技术,包括其工作原理、优势以及如何使用。线程池是 Java 并发编程的重要工具,它可以有效地管理和控制线程的执行,提高系统性能。通过本文的学习,读者将对线程池有更深入的理解,并能在实际开发中灵活运用。
|
13天前
|
Java 程序员 调度
Java中的多线程编程:基础知识与实践
【4月更文挑战第5天】 在现代软件开发中,多线程编程是一个不可或缺的技术要素。它允许程序员编写能够并行处理多个任务的程序,从而充分利用多核处理器的计算能力,提高应用程序的性能。Java作为一种广泛使用的编程语言,提供了丰富的多线程编程支持。本文将介绍Java多线程编程的基础知识,并通过实例演示如何创建和管理线程,以及如何解决多线程环境中的常见问题。
|
8天前
|
算法 Java 开发者
Java中的多线程编程:概念、实现与性能优化
【4月更文挑战第9天】在Java编程中,多线程是一种强大的工具,它允许开发者创建并发执行的程序,提高系统的响应性和吞吐量。本文将深入探讨Java多线程的核心概念,包括线程的生命周期、线程同步机制以及线程池的使用。接着,我们将展示如何通过继承Thread类和实现Runnable接口来创建线程,并讨论各自的优缺点。此外,文章还将介绍高级主题,如死锁的预防、避免和检测,以及如何使用并发集合和原子变量来提高多线程程序的性能和安全性。最后,我们将提供一些实用的性能优化技巧,帮助开发者编写出更高效、更稳定的多线程应用程序。
|
6天前
|
安全 算法 Java
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第11天】 在Java中,高效的并发编程是提升应用性能和响应能力的关键。本文将探讨Java并发的核心概念,包括线程安全、锁机制、线程池以及并发集合等,同时提供实用的编程技巧和最佳实践,帮助开发者在保证线程安全的前提下,优化程序性能。我们将通过分析常见的并发问题,如竞态条件、死锁,以及如何利用现代Java并发工具来避免这些问题,从而构建更加健壮和高效的多线程应用程序。
|
11天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第7天】在现代软件开发中,多线程编程已经成为一种不可或缺的技术。为了提高程序性能和资源利用率,Java提供了线程池这一强大工具。本文将深入探讨Java线程池的原理、使用方法以及如何根据实际需求定制线程池,帮助读者更好地理解和应用线程池技术。
15 0
|
2天前
|
设计模式 运维 安全
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第15天】在Java开发中,多线程编程是提升应用程序性能和响应能力的关键手段。然而,它伴随着诸多挑战,尤其是在保证线程安全的同时如何避免性能瓶颈。本文将探讨Java并发编程的核心概念,包括同步机制、锁优化、线程池使用以及并发集合等,旨在为开发者提供实用的线程安全策略和性能优化技巧。通过实例分析和最佳实践的分享,我们的目标是帮助读者构建既高效又可靠的多线程应用。