使用Disruptor实现生产者和消费者模型
生产者
package cn.lonecloud.procum.disruptor; import cn.lonecloud.procum.Data;
import com.lmax.disruptor.RingBuffer; import java.nio.ByteBuffer; /**
* @author lonecloud
* @version v1.0
* @date 下午3:02 2018/5/7
*/
public class Producer { //队列
private final RingBuffer<Data> dataRingBuffer; public Producer(RingBuffer<Data> dataRingBuffer) {
this.dataRingBuffer = dataRingBuffer;
} /**
* 插入数据
* @param s
*/
public void pushData(String s) { //获取下一个位置
long next = dataRingBuffer.next();
try {
//获取容器
Data data = dataRingBuffer.get(next);
//设置数据
data.setData(s);
} finally {
//插入
dataRingBuffer.publish(next);
}
}
}
消费者
package cn.lonecloud.procum.disruptor; import cn.lonecloud.procum.Data;
import com.lmax.disruptor.WorkHandler; /**
* @author lonecloud
* @version v1.0
* @date 下午3:01 2018/5/7
*/
public class Customer implements WorkHandler<Data> {
@Override
public void onEvent(Data data) throws Exception {
System.out.println(Thread.currentThread().getName()+"---"+data.getData());
}
}
数据工厂
package cn.lonecloud.procum.disruptor; import cn.lonecloud.procum.Data;
import com.lmax.disruptor.EventFactory; /**
* @author lonecloud
* @version v1.0
* @date 下午3:02 2018/5/7
*/
public class DataFactory implements EventFactory<Data> { @Override
public Data newInstance() {
return new Data();
}
}
主函数
package cn.lonecloud.procum.disruptor; import cn.lonecloud.procum.Data;
import com.lmax.disruptor.RingBuffer;
import com.lmax.disruptor.dsl.Disruptor; import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* @author lonecloud
* @version v1.0
* @date 下午3:09 2018/5/7
*/
public class Main {
public static void main(String[] args) throws InterruptedException {
//创建线程池
ExecutorService service = Executors.newCachedThreadPool();
//创建数据工厂
DataFactory dataFactory = new DataFactory();
//设置缓冲区大小,必须为2的指数,否则会有异常
int buffersize = 1024;
Disruptor<Data> dataDisruptor = new Disruptor<Data>(dataFactory, buffersize,
service);
//创建消费者线程
dataDisruptor.handleEventsWithWorkerPool(
new Customer(),
new Customer(),
new Customer(),
new Customer(),
new Customer(),
new Customer(),
new Customer()
);
//启动
dataDisruptor.start();
//获取其队列
RingBuffer<Data> ringBuffer = dataDisruptor.getRingBuffer();
for (int i = 0; i < 100; i++) {
//创建生产者
Producer producer = new Producer(ringBuffer);
//设置内容
producer.pushData(UUID.randomUUID().toString());
//Thread.sleep(1000);
}
}
}
其中策略有几种:
1. BlockingWaitStrategy:阻塞策略,最节省CPU,但是高并发条件下性能最糟糕
2 SleepingWaitStrategy:在循环中无限等待,处理数据会产生高延迟,对生产线程影响小,场景:异步日志
3. YieldingWaitStrategy:低延迟场合,使用必须保证剩余的消费者线程的逻辑CPU
4. BusySpinWaitStrategy:消费者线程会尽最大努力疯狂的监控缓冲区变化。
使用Disruptor实现生产者和消费者模型的更多相关文章
- Java线程(学习整理)--4---一个简单的生产者、消费者模型
1.简单的小例子: 下面这个例子主要观察的是: 一个对象的wait()和notify()使用情况! 当一个对象调用了wait(),那么当前掌握该对象锁标记的线程,就会让出CPU的使用权,转而进入该对 ...
- Python之生产者&、消费者模型
多线程中的生产者和消费者模型: 生产者和消费者可以用多线程实现,它们通过Queue队列进行通信. import time,random import Queue,threading q = Queue ...
- 【java线程系列】java线程系列之线程间的交互wait()/notify()/notifyAll()及生产者与消费者模型
关于线程,博主写过java线程详解基本上把java线程的基础知识都讲解到位了,但是那还远远不够,多线程的存在就是为了让多个线程去协作来完成某一具体任务,比如生产者与消费者模型,因此了解线程间的协作是非 ...
- Spring MVC 使用介绍(七)—— 注解式控制器(三):生产者与消费者模型
一.MIME类型 MIME类型格式:type/subtype(;parameter)? type:主类型,任意的字符串,如text,如果是*号代表所有 subtype:子类型,任意的字符串,如html ...
- 守护进程,互斥锁,IPC,队列,生产者与消费者模型
小知识点:在子进程中不能使用input输入! 一.守护进程 守护进程表示一个进程b 守护另一个进程a 当被守护的进程结束后,那么守护进程b也跟着结束了 应用场景:之所以开子进程,是为了帮助主进程完成某 ...
- python queue和生产者和消费者模型
queue队列 当必须安全地在多个线程之间交换信息时,队列在线程编程中特别有用. class queue.Queue(maxsize=0) #先入先出 class queue.LifoQueue(ma ...
- python并发编程之守护进程、互斥锁以及生产者和消费者模型
一.守护进程 主进程创建守护进程 守护进程其实就是'子进程' 一.守护进程内无法在开启子进程,否则会报错二.进程之间代码是相互独立的,主进程代码运行完毕,守护进程也会随机结束 守护进程简单实例: fr ...
- 人生苦短之我用Python篇(队列、生产者和消费者模型)
队列: queue.Queue(maxsize=0) #先入先出 queue.LifoQueue(maxsize=0) #last in fisrt out queue.PriorityQueue( ...
- python:生产者与消费者模型
1,生产者与消费者模型的矛盾在于数据供需的不平衡 import time import random from multiprocessing import Queue from multiproce ...
随机推荐
- python3 打开页面后多窗口处理三种方法
多窗口处理三种方法 导包,实例化浏览器from selenium import webdriver fx=webdriver.Firefox()方法一fx.switch_to.window(fx.wi ...
- C#的类型推断发展史
前言:随着C#的版本升级,C#编译器的类型推断功能也在不断的升级以适应语言进化过程中的变化,并为这个过程做了相应的优化. 隐式类型的数组 在C#1和C#2中,作为变量声明和初始化的一部分,初始化数组的 ...
- Oracle调优总结
Oracle调优总结(经典实践 重要) https://blog.csdn.net/dtjiawenwang88/article/details/74892245 https://www.cnblog ...
- vue中的适配:px2rem
这应该是vue项目在适配移动端时候,最简单的方法之一下面是基本步骤(使用cnpm)1.下载并引入lib-flexible cnpm install --save lib-flexible 在main. ...
- umount -fl用法
umount, 老是提示:device is busy, 服务又不能停止的.可以用"umount -fl"解决! 挂载: mount - mount a filesystem mo ...
- solr配置ik中文分词(二)
上一篇文章主要介绍了solr的安装与配置,这篇文章主要记录如何使用ik分词器对中文进行分词. 步骤: 1.下载ik分词jar包:ik-analyzer-solr5-5.x.jar. 2.将下载的jar ...
- Java多线程之Join方法阻塞线程
package org.study2.javabase.ThreadsDemo.status; /** * @Auther:GongXingRui * @Date:2018/9/19 * @Descr ...
- 二、kubernetes
一.kubernetes(简称k8s) 集群示意图 Kubernetes工作模式server-client,Kubenetes Master提供集中化管理Minions.部署1台Kubernetes ...
- TLS/SSL
- Nginx 如何增大nginx使用cpu有效时长
L:121 我们使用 这个命令查看nginx的cpu时间片切换 pidstat - 首先要知道问题: NICE 表示友好 也就是会让出时间切片 所以我们会将静态优先级设置比较低 让他很不友好 Prio ...