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. Linux测试硬盘读性能的常用工具-hdparm

    通常情况下可以使用fdisk.df等命令查看硬盘的分区情况以及当前已使用空间大小.剩余空间大小等信息.但是如果要查看硬盘的硬件信息如 硬盘型号.序列号.已运行时间等信息该用什么工具查看呢? 在Linu ...

  2. linux内核在哪里处理设备树中compatible为"syscon"的节点?

    答: linux内核源码drivers/mfd/syscon.c中的of_syscon_register()接口对regmap_config进行初始化 注: linux内核源码版本为5.1.0

  3. shell脚本将gbk文件转化为utf-8

    使用注意项: 原来文件格式gbk的,否则可能出现utf-8转utf-8乱码. #!/bin/bash function gbk2utf(){ file="$1" echo &quo ...

  4. Dart静态方法、对象操作符和类的继承

    /* Dart中的静态成员: 1.使用static 关键字来实现类级别的变量和函数 2.静态方法不能访问非静态成员,非静态方法可以访问静态成员 */ // class Person { // stat ...

  5. oracle 的自定义的存储函数遇到的 package or function is in an invalid state

    转: oracle 的自定义的存储函数遇到的 package or function is in an invalid state 2017-10-28 11:08:17 major_tom 阅读数 ...

  6. Tekla 导出ifc并浏览

    Tekla导出IFC

  7. Java程序员金三银四精心准备的面试题及答案(基础篇)

    1.面向对象的特征有哪些方面? [基础] 答:面向对象的特征主要有以下几个方面: 1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问 ...

  8. windows10 环境下的amqp安装步骤(图文)

    安装PHP扩展ampq 查看phpinfo()信息 下载ampq扩展 下载地址:http://pecl.php.net/package/amqp 选择一个dll版本下载,本文选择的是1.9.3 自己根 ...

  9. linux追加所有文件到新的文件(cat)

    例子如下,存在test1.txt, test2.txt, test3.txt,现在准备把这三个文件的内容都追加到testall.txt 中 test1.txt 1 2 3 4 5 6 test2.tx ...

  10. 报错:(未解决)NoReplicaOnlineException: No replica in ISR for partition __consumer_offsets-8 is alive. Live brokers are: [Set(50, 51, 52)], ISR brokers are: [68]

    报错背景: CDH集成kafka插件之后,启动kafka时就报出此错误. 报错现象: -- ::, ERROR state.change.logger: [Controller epoch=] Ini ...