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 实现多线程生产消费队列的更多相关文章

  1. 【并发】7、借助redis 实现多线程生产消费队列

    1.这是第一个简单的初始化版本,看起来比使用fqueue似乎更好用 package queue.redisQueue; import queue.fqueue.vo.TempVo; import re ...

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

    顾名思义这个就是再消费的时候,不是之前的那哥用yield进行线程切换的操作,而是用线程等待阻塞的方式去执行,说实话我感觉效率不一定有之前那个好, 因为我对这种阻塞队列使用的时候,之前有发现阻塞队列,塞 ...

  3. python多线程生产消费

    #!/usr/bin/env python# -*- coding: utf-8 -*- from threading import Threadfrom Queue import Queueimpo ...

  4. 【java并发编程】Lock & Condition 协调同步生产消费

    一.协调生产/消费的需求 本文内容主要想向大家介绍一下Lock结合Condition的使用方法,为了更好的理解Lock锁与Condition锁信号,我们来手写一个ArrayBlockingQueue. ...

  5. Python并发编程-生产消费模型

    生产消费模型初步 #产生两个子进程,Queue可以在子进程之间传递消息 from multiprocessing import Queue,Process import random import t ...

  6. kafka如何实现高并发存储-如何找到一条需要消费的数据(阿里)

    阿里太注重原理了:阿里问kafka如何实现高并发存储-如何找到一条需要消费的数据,kafka用了稀疏索引的方式,使用了二分查找法,其实很多索引都是二分查找法  二分查找法的时间复杂度:O(logn) ...

  7. 守护进程,互斥锁, IPC ,Queue队列,生产消费着模型

    1.守护进程 什么是守护进程? 进程是一个正在运行的程序 守护进程也是一个普通进程,意思是一个进程可以守护另一个进程,比如如果b是a的守护进程,a是被守护的进程,如果a进程结束,b进程也会随之结束. ...

  8. 7.JUC线程高级-生产消费问题&虚假唤醒

    描述 生产消费问题在java多线程的学习中是经常遇到的问题 ,多个线程共享通一个资源的时候会出现各种多线程中经常出现的各种问题. 实例说明 三个类:售货员Clerk,工厂Factory,消费者Cons ...

  9. Dyno-queues 分布式延迟队列 之 生产消费

    Dyno-queues 分布式延迟队列 之 生产消费 目录 Dyno-queues 分布式延迟队列 之 生产消费 0x00 摘要 0x01 前情回顾 1.1 设计目标 1.2 选型思路 0x02 产生 ...

随机推荐

  1. NTC3950-10K温度传感器

    一.计算公式 补充: B=3950 R=10K T2=25度 查RT表,25度对应的是10K 电路: 热敏电阻与上拉电阻R813分压,获取温度与Vo电压的关系,在根据Vo折算出与MCU ADC的数值. ...

  2. B站在微服务治理中的探索与实践

    https://mp.weixin.qq.com/s/_iFe8DO1e-QcYG-CJDTHpg

  3. 从内核3.7版本开始,Linux就开始支持VXLAN 到了内核3.12版本,Linux对VXLAN的支持已经完备,支持单播和组播,IPv4和IPv6。

    一.关于VXLAN VXLAN 是 Virtual eXtensible LANs 的缩写,它是对 VLAN 的一个扩展,是非常新的一个 tunnel 技术,在Open vSwitch中应用也非常多. ...

  4. lintcode 394. Coins in a Line 、leetcode 292. Nim Game 、lintcode 395. Coins in a Line II

    变型:如果是最后拿走所有石子那个人输,则f[0] = true 394. Coins in a Line dp[n]表示n个石子,先手的人,是必胜还是必输.拿1个石子,2个石子之后都是必胜,则当前必败 ...

  5. CDH 部署 Hadoop:5.开始安装

    Cloudera Enterprise 6.2.x   或者参考https://blog.csdn.net/shawnhu007/article/details/52579204 第零步:优化相关 e ...

  6. 【转载】 漫谈Code Review的错误实践

    原文地址: https://www.cnblogs.com/chaosyang/p/code-review-wrong-practices.html ------------------------- ...

  7. AD 常用策略

    配置WSUS 配置NTPS 配置用户配置文件漫游 配置漫游区磁盘配额 配置修改本地管理员用户名 配置修改本地管理员密码 配置网络验证(提示是否联网错误) 配置允许开设永久共享 配置允许开设共享打印机 ...

  8. 静态站点生成器-md-mkdocs

    推荐指数:

  9. 【Leetcode_easy】1033. Moving Stones Until Consecutive

    problem 1033. Moving Stones Until Consecutive 参考 1. Leetcode_easy_1033. Moving Stones Until Consecut ...

  10. 10点睛Spring MVC4.1-全局异常处理

    10.1 全局异常处理 使用@ControllerAdvice注解来实现全局异常处理; 使用@ControllerAdvice的属性缩小处理范围 10.2 演示 演示控制器 package com.w ...