【并发】6、借助FQueue 实现多线程生产消费队列
1.这里先要说一下为什么会想到fqueue,因为这个是一个轻量级的消息队列框架,并且速度很快,用起来很方便,就是这样
当然后期考虑使用redis,这里先上一个fqueue的版本,后面有时间我再吧他改成redis版本吧,感觉可能redis版本可能更适合
package queue.fqueue.vo; /**
* @ProjectName: cutter-point
* @Package: queue.fqueue.vo
* @ClassName: EventVo
* @Author: xiaof
* @Description: ${description}
* @Date: 2019/6/11 10:30
* @Version: 1.0
*/
public interface EventVo { public void doOperater(); }
package queue.fqueue.vo; import java.io.Serializable; /**
* @ProjectName: cutter-point
* @Package: queue.fqueue.vo
* @ClassName: TempVo
* @Author: xiaof
* @Description: ${description}
* @Date: 2019/6/11 10:18
* @Version: 1.0
*/
public class TempVo implements Serializable, EventVo { private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "TempVo{name='" + name + "'}";
} @Override
public void doOperater() {
System.out.println(name + " : say hello fqueue!");
}
}
package queue.fqueue; import net.apexes.fqueue.FQueue;
import queue.fqueue.vo.TempVo; import java.io.*; /**
* @ProjectName: cutter-point
* @Package: queue.fqueue
* @ClassName: FqueueProducter
* @Author: xiaof
* @Description: ${description}
* @Date: 2019/6/11 10:36
* @Version: 1.0
*/
public class FqueueProducter implements Runnable { private FQueue fQueue; public FqueueProducter(FQueue fQueue) {
this.fQueue = fQueue;
} @Override
public void run() { while(true) {
try {
Thread.sleep(2000); TempVo tempVo = new TempVo();
tempVo.setName(Thread.currentThread().getName() + ",time is:" + System.currentTimeMillis());
//序列化为字节
OutputStream arrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(arrayOutputStream);
objectOutputStream.writeObject(tempVo);
arrayOutputStream.flush(); fQueue.add(((ByteArrayOutputStream) arrayOutputStream).toByteArray()); } catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} }
}
package queue.fqueue; import net.apexes.fqueue.FQueue;
import queue.fqueue.vo.EventVo; import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream; /**
* @ProjectName: cutter-point
* @Package: queue.fqueue
* @ClassName: FqueueProducter
* @Author: xiaof
* @Description: ${description}
* @Date: 2019/6/11 9:40
* @Version: 1.0
*/
public class FqueueConsume implements Runnable { private FQueue fQueue; public FqueueConsume(FQueue fQueue) {
this.fQueue = fQueue;
} @Override
public void run() { while(true) { byte bytes[] = fQueue.poll(); //反序列化对象
if(bytes == null || bytes.length <= 0) {
Thread.yield();
continue;
} ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
try {
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
EventVo eventVo = (EventVo) objectInputStream.readObject(); eventVo.doOperater(); } catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} }
}
测试代码:
@Test
public void test3() throws IOException, FileFormatException, InterruptedException {
FQueue queue1 = new FQueue("db1"); //读写取数据
for(int i = 0; i < 5; ++i) {
System.out.println("输出测试" + i);
FqueueProducter producter = new FqueueProducter(queue1); Thread t = new Thread(producter);
t.start();
} //读写取数据
for(int i = 0; i < 2; ++i) {
System.out.println("输出测试" + i);
FqueueConsume fqueueConsume = new FqueueConsume(queue1); Thread t = new Thread(fqueueConsume);
t.setDaemon(true);
t.start();
} while(true) {
Thread.sleep(1000);
} }
效果展示:

【并发】6、借助FQueue 实现多线程生产消费队列的更多相关文章
- 【并发】7、借助redis 实现多线程生产消费队列
		
1.这是第一个简单的初始化版本,看起来比使用fqueue似乎更好用 package queue.redisQueue; import queue.fqueue.vo.TempVo; import re ...
 - 【并发】8、借助redis 实现多线程生产消费阻塞队列
		
顾名思义这个就是再消费的时候,不是之前的那哥用yield进行线程切换的操作,而是用线程等待阻塞的方式去执行,说实话我感觉效率不一定有之前那个好, 因为我对这种阻塞队列使用的时候,之前有发现阻塞队列,塞 ...
 - python多线程生产消费
		
#!/usr/bin/env python# -*- coding: utf-8 -*- from threading import Threadfrom Queue import Queueimpo ...
 - 【java并发编程】Lock & Condition 协调同步生产消费
		
一.协调生产/消费的需求 本文内容主要想向大家介绍一下Lock结合Condition的使用方法,为了更好的理解Lock锁与Condition锁信号,我们来手写一个ArrayBlockingQueue. ...
 - Python并发编程-生产消费模型
		
生产消费模型初步 #产生两个子进程,Queue可以在子进程之间传递消息 from multiprocessing import Queue,Process import random import t ...
 - kafka如何实现高并发存储-如何找到一条需要消费的数据(阿里)
		
阿里太注重原理了:阿里问kafka如何实现高并发存储-如何找到一条需要消费的数据,kafka用了稀疏索引的方式,使用了二分查找法,其实很多索引都是二分查找法 二分查找法的时间复杂度:O(logn) ...
 - 守护进程,互斥锁, IPC ,Queue队列,生产消费着模型
		
1.守护进程 什么是守护进程? 进程是一个正在运行的程序 守护进程也是一个普通进程,意思是一个进程可以守护另一个进程,比如如果b是a的守护进程,a是被守护的进程,如果a进程结束,b进程也会随之结束. ...
 - 7.JUC线程高级-生产消费问题&虚假唤醒
		
描述 生产消费问题在java多线程的学习中是经常遇到的问题 ,多个线程共享通一个资源的时候会出现各种多线程中经常出现的各种问题. 实例说明 三个类:售货员Clerk,工厂Factory,消费者Cons ...
 - Dyno-queues 分布式延迟队列 之 生产消费
		
Dyno-queues 分布式延迟队列 之 生产消费 目录 Dyno-queues 分布式延迟队列 之 生产消费 0x00 摘要 0x01 前情回顾 1.1 设计目标 1.2 选型思路 0x02 产生 ...
 
随机推荐
- 图片旋转 1. cv2.getRotationMatrix2D(获得仿射变化矩阵) 2. cv2.warpAffine(进行仿射变化)
			
原文:https://www.cnblogs.com/my-love-is-python/p/10959612.html 1.rot_mat = cv2.getRotationMatrix2D(ce ...
 - PHP 二维数组去重(保留各个键值的同时去除重复的项)
			
对于如下二维数组,要求对其进行去重: $arr = array( '=>array( 'name'=>'james', , ), '=>array( 'name'=>'susu ...
 - flutter 保持页面状态
			
import 'package:flutter/material.dart'; import 'KeepAliveDemo.dart'; void main() => runApp(MyApp( ...
 - 有些lambda表达式就可以体现出编程中「Context(上下文)」环境
			
编程中什么是「Context(上下文)」? 每一段程序都有很多外部变量.只有像Add这种简单的函数才是没有外部变量的.一旦你的一段程序有了外部变量,这段程序就不完整,不能独立运行.你为了使他们运行 ...
 - [译]使用Pandas读取大型Excel文件
			
上周我参加了dataisbeautiful subreddit上的Dataviz Battle,我们不得不从TSA声明数据集创建可视化.我喜欢这种比赛,因为大多数时候你最终都会学习很多有用的东西. 这 ...
 - 宣化上人:大佛顶首楞严经四种清净明诲浅释(4-5)(转自学佛网:http://www.xuefo.net/nr/article23/230699.html)
			
大佛顶首楞严经四种清净明诲浅释(4) 唐天竺·沙门般剌密帝译 宣化上人主讲 一九八三年四月十七日晚讲于万佛圣城 汝教世人修三摩地.先断心淫.是名如来.先佛世尊.第一决定清净明诲. 所以说,教人这个爱的 ...
 - Gson反序列json到实体类
			
gson在基准测试过程中各项性能接近于Jackson(具体可以看Benchmark of Java JSON libraries)里面的测试, 本人亲测过,实测结果与他的数据一致,Jackson安全性 ...
 - c-lodop获取任务页数-回调里给全局变量赋值并加减
			
LODOP一个任务里可以自动分页,也可以手动分页,超文本会按照打印项高度或超过纸张会自动分页(相关博文:Lodop打印控件 超文本自动分页),如果是自动分页,是无法知道究竟分了多少页,整个任务打了多少 ...
 - 使用sql语句创建和删除约束示例代码
			
使用sql语句创建和删除约束 约束类型 主键约束(Primary Key constraint) --:要求主键列数据唯一,并且不允许为空. 唯一约束(Unique constraint) --: ...
 - CentOS7使用yum安装RabbitMQ
			
转自:https://jingyan.baidu.com/article/456c463b16f3820a583144a1.html 登录名:admin 密码:admin 1. 如果安装后web界 ...