特点:阻塞队列,此队列有点特殊,没有存储空间,也就是不存储数据。每一个put操作必须等待一个take操作,反之,每一个take操作也必须等待一个put操作。如果put进去一个数据,那么必须等待这条数据被take走才put操作才算是执行完成。

应用场景:目前没有想到我碰到的场景,尴尬,但感觉就好比,一个人去相亲,一直等着另一方,只有另一方来了,两个人才可以手牵手一起走,不然就一直等着,有种同步执行的感觉。

代码案例:

package com.example.web.web;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.SynchronousQueue;

import java.util.concurrent.TimeUnit;

@RestController

public class HomeController {

@RequestMapping("/index")

public String index() throws Exception {

SynchronousQueue queue = new SynchronousQueue<>();

//生产者

new Thread(() ->

{

try {

TimeUnit.MILLISECONDS.sleep(3000);

System.out.println("生产者begin");

queue.put("测试数据");

//queue.offer("测试数据", 5, TimeUnit.SECONDS);

System.out.println("生产者end");

} catch (Exception ex) {

}

}).start();

//消费者

new Thread(() ->

{

try {

//TimeUnit.MILLISECONDS.sleep(3000);

System.out.println("消费者begin");

String aa = queue.take();

//String aa = queue.poll(5, TimeUnit.SECONDS);

System.out.println("消费者end" + aa);

} catch (Exception ex) {

}

}).start();

//主线程也等待下

TimeUnit.SECONDS.sleep(10);

return "网站已得到响应";

}

}

添加方法除了put()还有offer(),offer方法不会阻塞线程,有返回结果来判断是否接受数据成功。可传入参数,参数含义就是存在队列中的时间,如果到时间没有相对的操作来执行就会过期返回false。

take()还有poll()这两个方法也是一样的,用poll需要添加参数,如果不添加参数就是不等待直接获取,获取不到就是null值。如果有参数表示在规定时间内等待,在等待时间内有put操作则马上返回值,超过规定时间无put操作就返回null。

在new SynchronousQueue()时可以传递参数,bool类型,表示是否公平排序策略,这个公平排序就是后面来的操作上有序还是无序(说无序其实还是有序)。公平就是FIFO(先进先出),非公平就是LIFO(后进先出)。

参考链接:

https://www.cnblogs.com/duanxz/p/3252267.html

https://blog.csdn.net/hudashi/article/details/7076814

synchronousqueue场景_java并发队列之SynchronousQueue相关推荐

  1. java 代码段 执行超时 抛异常_Java 并发队列详解TransferQueue、BlockingQueue、BlockingDeque

    阻塞队列 BlockingQueue java.util.concurrent 包里的 BlockingQueue 接口表示一个线程安放入和提取实例的队列. BlockingQueue 用法 Bloc ...

  2. java 并发队列_JAVA并发编程:阻塞队列BlockingQueue之SynchronousQueue

    前面在讲解Executors工厂创建可缓存线程的线程池(newCachedThreadPool)的时候有提到过SynchronousQueue队列,该线程池使用 SynchronousQueue 作为 ...

  3. java并发队列_Java并发教程–阻塞队列

    java并发队列 如第3部分所述,Java 1.5中引入的线程池提供了核心支持,该支持很快成为许多Java开发人员的最爱. 在内部,这些实现巧妙地利用了Java 1.5中引入的另一种并发功能-阻塞队列 ...

  4. 10分钟搞定 Java 并发队列

    前言 如果按照用途与特性进行粗略的划分,JUC 包中包含的工具大体可以分为 6 类: 执行者与线程池 并发队列 同步工具 并发集合 锁 原子变量 在[并发系列]中,主要讲解了 执行者与线程池,同步工具 ...

  5. 10分钟搞定 Java 并发队列好吗?好的

    前言 如果按照用途与特性进行粗略的划分,JUC 包中包含的工具大体可以分为 6 类: 执行者与线程池 并发队列 同步工具 并发集合 锁 原子变量 在[并发系列]中,主要讲解了 执行者与线程池,同步工具 ...

  6. 聊聊Java中的并发队列中 有界队列和无界队列的区别

    转载自 https://blog.csdn.net/AJ1101/article/details/81711812 本文主要总体的说一说各种并发队列  首先来一张全体照  从有界无界上分  常见的有界 ...

  7. 并发队列、线程池、锁

    1.CountDownLatch(计数器)      CountDownLatch 类位于java.util.concurrent包下,利用它可以实现类似计数器的功能.比如有一个任务A,它要等待其他任 ...

  8. 解读 Java 并发队列 BlockingQueue

    最近得空,想写篇文章好好说说 java 线程池问题,我相信很多人都一知半解的,包括我自己在仔仔细细看源码之前,也有许多的不解,甚至有些地方我一直都没有理解到位. 说到线程池实现,那么就不得不涉及到各种 ...

  9. 并发队列的介绍及使用

    在JDK1.5新加入了一个包concurrent,位于java.util.concurrent.在我们写业务代码的时候,可能最为常见就是ConcurrentHashMap.当然今天我们的主角不是他,而 ...

最新文章

  1. 科大讯飞全新1024:3大计划,200项A.I.能力,全链路驱动应用场景创新!
  2. p2p网络测试工具_自媒体 IPFS官方升级DHT方案,提升网络整体性能
  3. 应用程序无法正常启动(0xc000007b)。请单击“确定”关闭应用程序
  4. strlen 与 sizeof 的区别详解
  5. 智能、弹性、易用:云时代的负载均衡之道
  6. 金融计算器 npv_一个工具箱 之 净现值(NPV)计算器
  7. TestNG和Maven配置指南
  8. autosar工具链_Autosar开发与手写代码开发的区别
  9. Jstatd命令(Java Statistics Monitoring Daemon)
  10. Sister Sharp
  11. Kafka 分布式消息系统 基础概念剖析
  12. php中paynotify,PayNotifyValidator.php
  13. UCRT: VC 2015 Universal CRT, by Microsoft
  14. QCA9531修改寄存器值控制GPIO
  15. (老机福音,重装后恢复软件设置)Ghost_XP_战神 V11 老机版
  16. GIGABYTE技嘉主板内存手动超频教程
  17. 查询结果按中文拼音顺序排序
  18. java获取文件名格式 / java获取文件名后缀
  19. c语言考试的说说带图片致自己,励志说说带图片致自己
  20. 沐风:可怕的想什么就来什么

热门文章

  1. SAP创建Web Service以及用ABAP调用
  2. SAP 物料分类账常用表
  3. 如何在TC里输出下拉列表
  4. 好用的数据分析工具能顶半个BI团队?大佬力荐这款工具值得体验
  5. 华为云FusionInsight+永洪BI共建政企用数之道,普惠千行百业
  6. a*算法的优缺点_五种聚类算法一览与python实现
  7. Oracle中的within,Oracle函数 --聚合函数中的语法within group
  8. 在Python 中 a=a+b 与 a+=b 区别,你真的知道嘛?
  9. Python基础教程:super()方法详解
  10. python3 基础教程: 文件read方法(read、readline、readlines)