java并发队列
阻塞队列
常见的阻塞队列有ArrayBlockingQueue,LinkedBlockingDeque,LinkedBlockingQueue,这些队列有界且可以阻塞线程
ArrayBlockingQueue
ArrayBlockingQueue是有界的阻塞队列,LinkedBlockingDeque通过数组、非空和非满Condition、RantrantLock实现了线程安全。空的时候take阻塞,满的时候put阻塞
java并发初探LinkedBlockingQueue
LinkedBlockingQueue是有界的阻塞队列,通过head,last节点,putLock插入锁,takeLock取锁、非空和非满condition、单向链表实现了线程安全的阻塞队列,空的时候take阻塞,满的时候put阻塞
java并发初探LinkedBlockingQueue
LinkedBlockingQueue是有界的阻塞队列,通过head,last节点,putLock插入锁,takeLock取锁、非空和非满condition、单向链表实现了线程安全的阻塞队列,空的时候take阻塞,满的时候put阻塞
非阻塞队列
java并发初探ConcurrentLinkedQueue
ConcurrentLinkedQueue是线程安全的无界队列,通过volatile和CAS操作保证了线程安全。
例子
阻塞队列当满的时候put元素回阻塞,实现队列接口的LinkedList在多线程的时候会跑出ConcurrentModifExeception异常
package com.java.javabase.thread.collection;
import lombok.extern.slf4j.Slf4j;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.LinkedBlockingQueue;
/**
 * @author
 */
@Slf4j
public class BlockingQueueTest {
/*    public static Queue<String> queue = new ArrayBlockingQueue<String>(20);
    public static ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>(20);
    public static LinkedBlockingDeque<String> queue = new LinkedBlockingDeque<String>(20);
    public static LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>(20);
    public static Queue<String> queue =new LinkedList<String>();
    public static ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();
    */
    public static ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>(20);
    public static int size = 15;
    public static void main(String[] args) {
        Thread t1 = new InnerThread("t1");
        Thread t2 = new InnerThread("t2");
        t1.start();
        t2.start();
        try {
            Thread.sleep(2000);
            printQueue(queue);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    static class InnerThread extends Thread {
        String name;
        public InnerThread(String name) {
            super(name);
            this.name=name;
        }
        @Override
        public void run() {
            for (int i = 0; i < size; i++) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                String tmp=i+" "+name;
                //queue.add(tmp);
                try {
                    queue.put(tmp);
                    //queue.add(tmp);
                } catch (InterruptedException e) {
                    log.error("error",e);
                }
                printQueueNone(queue);
            }
        }
    }
    public static void printQueue(Queue queue) {
        Iterator iterator = queue.iterator();
        while (iterator.hasNext()) {
            log.info("thread {} print {}", Thread.currentThread().getName(), iterator.next());
        }
    }
    public static void printQueueNone(Queue queue) {
        Iterator iterator = queue.iterator();
        while (iterator.hasNext()) {
            iterator.next();
        }
    }
}
运行结果
2019-08-28 19:42:32,684   [main] INFO  BlockingQueueTest  - thread main print 0 t1
2019-08-28 19:42:32,686   [main] INFO  BlockingQueueTest  - thread main print 0 t2
2019-08-28 19:42:32,687   [main] INFO  BlockingQueueTest  - thread main print 1 t2
2019-08-28 19:42:32,687   [main] INFO  BlockingQueueTest  - thread main print 1 t1
2019-08-28 19:42:32,687   [main] INFO  BlockingQueueTest  - thread main print 2 t2
2019-08-28 19:42:32,687   [main] INFO  BlockingQueueTest  - thread main print 2 t1
2019-08-28 19:42:32,687   [main] INFO  BlockingQueueTest  - thread main print 3 t1
2019-08-28 19:42:32,687   [main] INFO  BlockingQueueTest  - thread main print 3 t2
2019-08-28 19:42:32,687   [main] INFO  BlockingQueueTest  - thread main print 4 t2
2019-08-28 19:42:32,687   [main] INFO  BlockingQueueTest  - thread main print 4 t1
2019-08-28 19:42:32,687   [main] INFO  BlockingQueueTest  - thread main print 5 t2
2019-08-28 19:42:32,687   [main] INFO  BlockingQueueTest  - thread main print 5 t1
2019-08-28 19:42:32,687   [main] INFO  BlockingQueueTest  - thread main print 6 t1
2019-08-28 19:42:32,687   [main] INFO  BlockingQueueTest  - thread main print 6 t2
2019-08-28 19:42:32,687   [main] INFO  BlockingQueueTest  - thread main print 7 t1
2019-08-28 19:42:32,687   [main] INFO  BlockingQueueTest  - thread main print 7 t2
2019-08-28 19:42:32,687   [main] INFO  BlockingQueueTest  - thread main print 8 t2
2019-08-28 19:42:32,687   [main] INFO  BlockingQueueTest  - thread main print 8 t1
2019-08-28 19:42:32,687   [main] INFO  BlockingQueueTest  - thread main print 9 t2
2019-08-28 19:42:32,687   [main] INFO  BlockingQueueTest  - thread main print 9 t1
java并发队列的更多相关文章
- 解读 java 并发队列 BlockingQueue
		点击添加图片描述(最多60个字)编辑 今天呢!灯塔君跟大家讲: 解读 java 并发队列 BlockingQueue 最近得空,想写篇文章好好说说 java 线程池问题,我相信很多人都一知半解的,包括 ... 
- 10分钟搞定 Java 并发队列好吗?好的
		| 好看请赞,养成习惯 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it ... 
- Java并发队列与容器
		[前言:无论是大数据从业人员还是Java从业人员,掌握Java高并发和多线程是必备技能之一.本文主要阐述Java并发包下的阻塞队列和并发容器,其实研读过大数据相关技术如Spark.Storm等源码的, ... 
- 并发编程(九)—— Java 并发队列 BlockingQueue 实现之 LinkedBlockingQueue 源码分析
		LinkedBlockingQueue 在看源码之前,通过查询API发现对LinkedBlockingQueue特点的简单介绍: 1.LinkedBlockingQueue是一个由链表实现的有界队列阻 ... 
- Java 并发队列 BlockingQueue
		BlockingQueue 开篇先介绍下 BlockingQueue 这个接口的规则,后面再看其实现. 首先,最基本的来说, BlockingQueue 是一个先进先出的队列(Queue),为什么说是 ... 
- 并发编程(八)—— Java 并发队列 BlockingQueue 实现之 ArrayBlockingQueue 源码分析
		开篇先介绍下 BlockingQueue 这个接口的规则,后面再看其实现. 阻塞队列概要 阻塞队列与我们平常接触的普通队列(LinkedList或ArrayList等)的最大不同点,在于阻塞队列的阻塞 ... 
- 并发编程(十)—— Java 并发队列 BlockingQueue 实现之 SynchronousQueue源码分析
		BlockingQueue 实现之 SynchronousQueue SynchronousQueue是一个没有数据缓冲的BlockingQueue,生产者线程对其的插入操作put必须等待消费者的移除 ... 
- Java并发(十八):阻塞队列BlockingQueue
		阻塞队列(BlockingQueue)是一个支持两个附加操作的队列. 这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空.当队列满时,存储元素的线程会等待队列可用. 阻塞队列常用于生产 ... 
- Java并发指南11:解读 Java 阻塞队列 BlockingQueue
		解读 Java 并发队列 BlockingQueue 转自:https://javadoop.com/post/java-concurrent-queue 最近得空,想写篇文章好好说说 java 线程 ... 
随机推荐
- python中,字符串前的u,b,r字符的含义
			1.字符串前加 u 例:u"我是含有中文字符组成的字符串." 作用: 后面字符串以 Unicode 格式 进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时 ... 
- NAT-T和PAT(IPSec)
			¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥NAT-T技术介绍¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥ 为什么TCP和UDP不能穿越:TCP和UDP有一个IP头的尾部校验(校验头部和负载 ... 
- 使用new时,会发生什么?
			使用new来调用函数,或者说发生构造函数调用时,会自动执行下面的操作: 创建(或说构造)一个全新的对象. 这个新对象会被执行[[prototype]]连接. 这个新对象会绑定到函数调用的this. 如 ... 
- vector 踩过的坑
			今天,做LeetCode上的一道题,198题:Rob House,在纸上画了画,发现了重复的结构,就使用了递归的方式实现的 #include<iostream> #include<v ... 
- Git fork后如何同步源仓库更新
			1. 设置源仓库的远程地址 >> git remote add [新地址名称] [源仓库远程地址] >> git remote add upstream https://git ... 
- linux 从一台机器复制文件到另一台linux机器上去
			1.功能说明scp就是security copy,用于将文件或者目录从一个Linux系统拷贝到另一个Linux系统下.scp传输数据用的是SSH协议,保证了数据传输的安全,其格式如下:scp 远程用户 ... 
- Mysql  分组查询出现'this is incompatible with sql_mode=only_full_group_by'的解决办法
			由于Mysql自动开启了 only_full_group_by,所以若查询的字段不在group by里面,则分组报错. 解决办法其一:mysql配置,关闭only_full_group_by,这种办法 ... 
- openstack搭建之旅(原创)
			1.什么是openstack是一个集中管理虚拟机的平台,整合了各种虚拟化的技术.虚拟机的具体创建交给具体的虚拟化技术实现,而Openstack是整合这些虚拟化技术,提供一个统一管理的视图,对虚拟机进行 ... 
- vue配置、创建项目及运行
			首先安装Node.js, npm i -g cnpm --registry=https://registry.npm.taobao.org 安装镜像 安装以后cnpm可以代替npm cnpm i -g ... 
- 树莓派4B踩坑指南 - (4)输入法和字体
			输入法和字体 fcitx 安装谷歌输入法和sunpinyin,哪个不用可以装完卸载: sudo apt-get install fcitx fcitx-googlepinyin fcitx-modul ... 
