java并发之LinkedTransferQueue

特点:阻塞队列,无界队列,这个玩意还比较奇怪,特点就是多了transfer和tryTransfer,对了还有getWaitingConsumerCount()和hasWaitingConsumer()连个方法,就是获取是否有等待的消费者。这个玩意我的理解,put和offer效果是一样的都不会阻塞线程,只有transfer方法会阻塞方法,等待有消费者后这个方法才会执行下去,tryTransfer可以设置等待时间。和SynchronousQueue队列非常像,只是SynchronousQueue队列无法存储数据,此队列可以存储数据。

如果A线程调用transfer此线程会阻塞,B线程调用put可以往队列存放数据,这两个线程那个先执行,哪个数据就会被消费线程先消费掉。

应用场景:这玩意我也还不知道那个场景适合,就是调用transfer方法,会等待消费者将队列中的数据消费掉才会执行。不用此方法和一般队列无太大差别,但是网上不少博客说此队列性能高,因为无锁操作都是CAS+自旋实现的。

代码案例:

package com.example.web.web;

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

import java.util.concurrent.LinkedTransferQueue;
import java.util.concurrent.TimeUnit;

@RestController
public class HomeController {

    @RequestMapping("/index")
    public String index() throws Exception {
        LinkedTransferQueue<String> queue = new LinkedTransferQueue<>();
        //生产者
        new Thread(() ->
        {
            try {
                TimeUnit.SECONDS.sleep(1);
                System.out.println("生产者begin1");
                queue.transfer("测试数据1");
                System.out.println("生产者end1");
            } catch (Exception ex) {
                System.out.println(ex);
            }
        }).start();

        //生产者2
        new Thread(() ->
        {
            try {
                System.out.println("生产者begin2");
                queue.put("测试数据2");
                System.out.println("生产者end2");
            } catch (Exception ex) {
                System.out.println(ex);
            }
        }).start();

        //消费者
        new Thread(() ->
        {
            try {
                for (int i = 0; i < 2; i++) {
                    System.out.println("==消费者begin");
                    TimeUnit.SECONDS.sleep(3);
                    String aa = queue.take();
                    System.out.println("==消费者end" + aa);
                }
            } catch (Exception ex) {
                System.out.println(ex);
            }
        }).start();

        //主线程也等待下
        TimeUnit.SECONDS.sleep(15);
        return "网站已得到响应";
    }
}

 

参考链接:

https://www.2cto.com/kf/201904/805737.html

https://www.cnblogs.com/stateis0/p/9062076.html

 

 

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值