标签:多线程(52)JAVA(605)

上个星期总结了一下synchronized相关的知识,这次将Queue相关的知识总结一下,和朋友们分享。

在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。

注:什么叫线程安全?这个首先要明确。线程安全的类 ,指的是类内共享的全局变量的访问必须保证是不受多线程形式影响的。如果由于多线程的访问(比如修改、遍历、查看)而使这些变量结构被破坏或者针对这些变量操作的原子性被破坏,则这个类就不是线程安全的。

今天就聊聊这两种Queue,本文分为以下两个部分,用分割线分开:

BlockingQueue

ConcurrentLinkedQueue,非阻塞算法

首先来看看BlockingQueue:

Queue是什么就不需要多说了吧,一句话:队列是先进先出。相对的,栈是后进先出。如果不熟悉的话先找本基础的数据结构的书看看吧。

BlockingQueue,顾名思义,“阻塞队列”:可以提供阻塞功能的队列。

首先,看看BlockingQueue提供的常用方法:

从上表可以很明显看出每个方法的作用,这个不用多说。我想说的是:

add(e) remove() element() 方法不会阻塞线程。当不满足约束条件时,会抛出IllegalStateExcepTIon 异常。例如:当队列被元素填满后,再调用add(e),则会抛出异常。

offer(e) poll() peek() 方法即不会阻塞线程,也不会抛出异常。例如:当队列被元素填满后,再调用offer(e),则不会插入元素,函数返回false。

要想要实现阻塞功能,需要调用put(e) take() 方法。当不满足约束条件时,会阻塞线程。

好,上点源码你就更明白了。以ArrayBlockingQueue类为例:

对于第一类方法,很明显如果操作不成功就抛异常。而且可以看到其实调用的是第二类的方法,为什么?因为第二类方法返回boolean啊。

Java代码

public boolean add(E e) {

if (offer(e))

return true;

else

throw new IllegalStateExcepTIon(“Queue full”);//队列已满,抛异常

}

public E remove() {

E x = poll();

if (x != null)

return x;

else

throw new NoSuchElementExcepTIon();//队列为空,抛异常

}

对于第二类方法,很标准的ReentrantLock使用方式(不熟悉的朋友看一下我上一篇帖子吧),另外对于insert和extract的实现没啥好说的。

注:先不看阻塞与否,这ReentrantLock的使用方式就能说明这个类是线程安全类。

Java代码

public boolean offer(E e) {

java多线程总结图_Java多线程总结之Queue相关推荐

  1. java 多线程下载图片_java多线程实现下载图片并压缩

    最近在做一个需求:从其他系统的ftp目录下载存储图片url的文件,然后读取文件中的url地址,根据地址下载图片后按天压缩成一个包,平均一个地址文件中包含4000个地址左右,也就是说一个文件扫描后需要下 ...

  2. java线程代码实现_Java 多线程代码实现讲解

    作为一个完全面向对象的语言,Java提供了类 java.lang.Thread 来方便多线程编程,这个类提供了大量的方法来方便我们控制自己的各个线程.那么如何提供给 Java 我们要线程执行的代码呢? ...

  3. java 锁旗标_Java多线程

    Java多线程 1. 多线程存在的意义 多线程最大的作用就是能够创建"灵活响应"的桌面程序,而编写多线程最大的困难就是不同线程之间共享资源的问题,要使这些资源不会同时被多个线程访问 ...

  4. java线程怎么用_Java多线程基本使用

    一.概念 1.进程 1.1进程:是一个正在进行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元. 1.2线程:就是进程中一个独立的控制单元,线程在控制着进程的执行,一 ...

  5. java 线程 状态 图_Java提高——多线程(一)状态图

    操作系统中的进程和线程的概念 进程是指一个内存运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程,比如windows下的一个运行的应用程序.exe就是一个进程. 线程是指进 ...

  6. java 多线程下载器_Java多线程的下载器(1)

    实现了一个基于Java多线程的下载器,可提供的功能有: 1. 对文件使用多线程下载,并显示每时刻的下载速度. 2. 对多个下载进行管理,包括线程调度,内存管理等. 一:单个文件下载的管理 1. 单文件 ...

  7. java模拟交通信号灯_java 多线程交通信号灯模拟过程详解

    这学期我们java课程的课程设计项目----交通信号灯的线程设计 实验目的:多线程设计,同步机制 题意 设计一个交通信号灯类: 变量:位置.颜色(红.黄.绿).显示时间(秒). 方法:切换信号灯. 创 ...

  8. java同步与死锁_Java多线程 - 线程同步与死锁

    一.线程同步 1)模拟多个用户同时从银行账户里面取钱 ● Account 类:银行账户类,里面有一些账户的基本信息,以及操作账户信息的方法 //模拟银行账户 classAccount {private ...

  9. java多线程 生产者消费者_java多线程之-生产者与消费者

    java多线程之-并发协作[生产者与消费者]模型 对于多线程程序来说,不管c/c++ java python 等任何编程语言,生产者与消费者模型都是最为经典的.也就是可以说多线程的并发协作 对于此模型 ...

最新文章

  1. 软件开发 理想_我如何在12个月内找到理想的软件工作
  2. 英国JIC院士组3.8万英镑招博后-植物代谢物与微生物组-截止6月27日
  3. mega_[MEGA DEAL]终极Java专家认证捆绑包(98%)
  4. python3菜鸟教程中文-我的python学习方法和资源整理,干货分享
  5. hibernate+mysql保存中文数据乱码问题
  6. 使用asp.net中的跟踪功能
  7. 【数据结构与算法】之链表的操作和使用
  8. Spring Security和自定义密码编码
  9. 字节内部自动化测试培训资料,明年涨薪用得上
  10. 树莓派之ubuntu安装docker
  11. 基于热传导方程的高温作业专用服装设计(二)
  12. 来吧!带你玩转 Excel VBA
  13. 【顶】(与同事合作的快乐)技术人员也需要先学会做人,再学会做事,再是能成事,最后是成名得利...
  14. 记录下我磕磕碰碰的三个月找工作经历,完整PDF
  15. (3)riak_core系统的工作方式
  16. php riak,PHP操作Riak
  17. 前端程序猿常用网站总结
  18. iOS 添加微信分享sdk流程
  19. H323plus的编译安装配置与使用:从头开始
  20. u盘计算机无法找到该项目,技术员教你win10系统删除文件时提示找不到该项目的方法...

热门文章

  1. 数字图像处理中常用图像分割算法有哪些?
  2. linux rpm目录,Linux修改RPM的安装目录的方法
  3. tf.ones_like(tensor, dtype=None, name=None, optimize=True)示例
  4. 宝塔面板遇到No space left on device错误的解决方法
  5. 人脸检测对齐--Joint Cascade Face Detection and Alignment
  6. 【opus源码分析】celt_fir5函数
  7. LeetCode 72. Edit Distance--动态规划--Levenshtein Distance Algorithm--Java,Python解法
  8. 解决Redis报错:MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist
  9. LeetCode 77. Combinations--回溯法,-Python,Java解法
  10. eclipse Hibernate