首页 > 其他分享 >阻塞式并发队列

阻塞式并发队列

时间:2023-02-08 11:36:00浏览次数:44  
标签:strs 队列 void 阻塞 并发 LinkedTransferQueue public 消费者


--BlockingQueue: 阻塞式队列--可以实现生产者消费者模式
  --LinkedBQ: 链表实现
        --ArrayBQ:数组实现, 有限队列
        --DelayQueue: 执行定时任务,可以设置多长时间被消费者拿走
        --LinkedTransferQueue: 应用情形:消费者先启动,生产者生产一个东西的时候(调用transfer方法)不往
队列里面放,而是查看有没有消费者,如果有消费者就直接给消费者消费,如果这时候没有消费者就 会产生阻塞,下面的代码就不会执行了。但是还是可以调用add()等方法向容器中添加元素
--SynchronousQueue(特殊的LinkedTransferQueue): 跟LinkedTransferQueue基本一样,不同的是SynchronousQueue的容量为零,不能调用add()等方法向容器添加元素,只能调用put()方法来阻塞等待消费者消费。而LinkedTransferQueue可以向容量添加元素,也可以使用transfer()方法阻塞等待消费者消费


1.LinkedBlockingQueue

public class A {

//阻塞式队列--可以实现生产者消费者模式
static BlockingQueue<String> strs = new LinkedBlockingQueue<String>();

public static void main(String[] args) {
//开启一个生产者线程
new Thread() {
public void run() {
for (int i = 0; i < 10; i++) {
try {
strs.put("a" + i);
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();

//开启5个消费者线程
for (int i = 0; i < 5; i++) {
new Thread() {
public void run() {
try {
while(true){
//使用take()方法进行消费
System.out.println(Thread.currentThread().getName() + "消费"+strs.take());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}

}

}




2.有界队列: ArrayBlockingQueue

public class B {

//有界队列,这里是10个就满了
static BlockingQueue<String> strs = new ArrayBlockingQueue<String>(10);

public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 10; i++) {
strs.put("a" + i);//装了10个就装不下了
}
//strs.add("aa");//满了调用add()方法想要再添加就会抛出异常
System.out.println(strs);
//strs.put("aaa");//满了就会等待,程序阻塞,看清楚这里是阻塞,下面的代码是不会再执行了
boolean offer = strs.offer("a");//没有添加成功返回false
System.out.println(offer);
System.out.println(strs);
}

}




3.LinkedTransferQueue

public class C {

public static void main(String[] args) {
LinkedTransferQueue<String> strs = new LinkedTransferQueue();

//如果想要使用transfer()方法就必须要先启动消费者
new Thread() {
public void run() {
System.out.println(strs.take());
}
};

//生产,这时候必须要有消费者消费掉,否则就阻塞在这里,下面的代码不会执行了
strs.transfer("aaa");//使用该方法是不会向队列里面放东西,只要是transfer()一个东西,就必须有消费者消费
strs.put("aa");//使用该方法就不会发生阻塞
}

}



4.SynchronousQueue(特殊的LinkedTransferQueue)

public class D {

public static void main(String[] args) throws InterruptedException {
//该并发容器的容量为零,不能向容器里面放东西,必须马上被消费者消费掉
final BlockingQueue<String> strs = new SynchronousQueue();

//先启动消费者
new Thread() {
public void run() {
while(true) {
try {
System.out.println(strs.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();

//strs.add("a");//不能调用add()方法,因为不能向容器里面放东西
strs.put("a");//阻塞等待消费者消费,如果没有被消费,则下面的代码执行不了(被阻塞了)
System.out.println(strs.size());//容器的容量必须时刻为零
}

}



标签:strs,队列,void,阻塞,并发,LinkedTransferQueue,public,消费者
From: https://blog.51cto.com/u_12182769/6043791

相关文章

  • OpenHarmony开发15 —— 消息队列
    OpenHarmony开发15——消息队列说点别的,这几天没更新真的是被这个消息队列折磨完了,谁知道鬼鸿蒙它不进行任何提示!为什么stackoverflow会不提示啊!!!太折磨了太折磨了......
  • STL-stack栈容器&queue队列容器
    <aname="LfCAT"></a>stack栈容器基本概念stack是一种先进后出(​​FristInLastOut,FILO​​)的数据结构,它只有一个出口<br/><br/>栈中只有顶端的元素才可以被外界访问......
  • 重学单调队列优化dp
    再谈单调队列优化dp。题目:CF1077F1&2PictureswithKittens(Easy&hardversion)从n个数中选出m个数,连续k个数至少选出一个,最大化选出数和。easyversion普通dp,hard则......
  • UVA540 Team Queue 队列入门经典
    题意翻译有t个团队的人正在排一个长队。每次新来一个人时,如果他有队友在排队,那么新人会插队到最后一个队友的身后。如果没有任何一个队友排队,则他会被排到长队的队尾。输入......
  • 并发相关知识点
    并发并发不提高,可用就是耍流氓基础设施在分层架构中,最底层就是基础设施,一般来说包含物理服务器、IDC、部署方式等等,就像一个金字塔,只有底座稳定了,上层才能稳定。基础......
  • 如何保证redis的高可用,高并发
    高可用考虑如何用redis来加多台机器,保证redis是高并发的,还有就是如何让redis保证自己不是挂掉以后就直接死掉了,即redis高可用高并发redis实现高并发主要依靠......
  • 消息队列数据丢失及可靠性
    用MQ有个基本原则,就是数据不能多一条,也不能少一条,不能多,就是前面说的重复消费和幂等性问题。不能少,就是说这数据别搞丢了。那这个问题你必须得考虑一下。如果说你这个......
  • 消息队列的延时以及过期失效,消息队列消息积压及占满问题解决思路
    大量消息在mq里积压了几个小时了还没解决几千万条数据在MQ里积压了七八个小时,从下午4点多,积压到了晚上11点多。这个是我们真实遇到过的一个场景,确实是线上故障了......
  • 消息队列部署选择
    部署是单机还是集群呢?你们高可用是怎么保证的呢?如果有人问到你MQ的知识,高可用是必问的。上一讲提到,MQ会导致系统可用性降低。所以只要你用了MQ,接下来问的一些要点......
  • (转)go语言-golang基础-queue队列和stack堆栈
    原文:https://www.cnblogs.com/malukang/p/12708850.html1.queue队列队列(queue),是一种FIFO(FirstInFirstOut)先进先出的线性表。通常用数据或者链表来实现队列。队......