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<String> 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

转载于:https://my.oschina.net/uwith/blog/3056608

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值