【并发】8、借助redis实现多线程生产消费阻塞队列

【并发】8、借助redis实现多线程⽣产消费阻塞队列
顾名思义这个就是再消费的时候,不是之前的那哥⽤yield进⾏线程切换的操作,⽽是⽤线程等待阻塞的⽅式去执⾏,说实话我感觉效率不⼀定有之前那个好,因为我对这种阻塞队列使⽤的时候,之前有发现阻塞队列,塞着塞着线程就会进⼊假死状态,这个很奇怪,但是有的时候⼜是好的,这个也不清楚到底是为什么但是毕竟也是⼀种实现,我就写出来了看看吧
⽣产者
disQueue;
import queue.fqueue.vo.TempVo;
import redis.clients.jedis.Jedis;
import java.io.ByteArrayOutputStream;
import java.io.ObjectOutputStream;
import java.util.UUID;
/
**
* @ProjectName: cutter-point
* @Package: disQueue
* @ClassName: RedisQueueProducter2
* @Author: xiaof
* @Description: ${description}
* @Date: 2019/6/12 16:29
* @Version: 1.0
*/
public class RedisQueueProducter2 implements Runnable {
private Jedis jedis;
private String queueKey;
掌中宽带public RedisQueueProducter2(Jedis jedis, String queueKey) {
this.jedis = jedis;
this.queueKey = queueKey;
}
@Override
public void run() {
while(true) {
try {
Thread.sleep((long) (Math.random() * 1000));
//不存在则创建,存在则直接插⼊
/
/向redis队列中存放数据
//⽣成数据
TempVo tempVo = new TempVo();
tempVo.setName(Thread.currentThread().getName() + ",time is:" + UUID.randomUUID());
//序列化为字节
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(arrayOutputStream);
objectOutputStream.writeObject(tempVo);
arrayOutputStream.flush();
try {
int i = 0;
while(i < 10) {
long num = jedis.Bytes(), ByteArray());
库仑定律教案if(num > 0) {
System.out.println("成功!");
break;
}
消费者++i;
}
} catch (Exception e) {
System.out.println("失败!");
//                    long num = jedis.Bytes(), ByteArray());                }
} catch (Exception e) {
e.printStackTrace();
}儿童虚拟社区
}
建湖实验小学}
}
disQueue;
import queue.fqueue.vo.EventVo;
import redis.clients.jedis.Jedis;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.List;
/**
* @ProjectName: cutter-point
* @Package: disQueue
* @ClassName: RedisQueueConsume2
* @Author: xiaof
* @Description: ${description}
* @Date: 2019/6/12 16:40
* @Version: 1.0
*/
public class RedisQueueConsume2 implements Runnable {
private Jedis jedis;
private String queueKey;
public RedisQueueConsume2(Jedis jedis, String queueKey) {
this.jedis = jedis;
this.queueKey = queueKey;
}
@Override
public void run() {
while(true) {
List<byte[]> bytesList = null;
try{
//这种就是阻塞队列模式
柳永雨霖铃赏析bytesList = jedis.blpop(0, Bytes());
} catch (Exception e) {
}
//反序列化对象
if(bytesList == null || bytesList.size() <= 0) {
Thread.yield();
continue;
}
//获取第⼆个对象,就是我们的字节数组
System.out.println(new (0)));
测试代码
消费队列
接下来我们把⽣产线程停掉
ByteArrayInputStream byteArrayInputStream = new  (1));            try  {
ObjectInputStream objectInputStream = new  ObjectInputStream(byteArrayInputStream);                EventVo eventVo = (EventVo) adObject();
eventVo.doOperater();
} catch  (IOException e) {
e.printStackTrace();
} catch  (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}
此时队列还有
我们把它消费完
美国丽人下载当只剩最后⼀个的时候
可以进⼊下⼀步,好当队列为空的时候,我们再尝试去取数据的时候
队列会阻塞再这个地⽅,相当于是挂起线程

本文发布于:2024-09-22 01:33:02,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/409743.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:队列   阻塞   线程   时候   状态   消费   存在   字节
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议