synchronousqueue场景_java并发队列之SynchronousQueue

特点:阻塞队列,此队列有点特殊,没有存储空间,也就是不存储数据。每一个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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值