没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
JAVA 并发编程深度学习-无锁并行计算框架
第1节 并发编程与无锁并行计算框架初探
public interface Constants {
int EVENT_NUM_OHM = 100000000;
int EVENT_NUM_FM = 50000000;
int EVENT_NUM_OM = 10000000;
}
public class ArrayBlockingQueue4Test {
public static void main(String[] args) {
final ArrayBlockingQueue<Message> queue = new
ArrayBlockingQueue<>(Constants.EVENT_NUM_OM);
final long startTime = System.currentTimeMillis();
new Thread(()->{
long i = 0;
while (i < Constants.EVENT_NUM_OHM) {
Message message = new Message(i, "c" + i);
try {
queue.put(message);
} catch (InterruptedException e) {
e.printStackTrace();
}
i++;
}
}).start();
new Thread(()->{
int k = 0;
while (k < Constants.EVENT_NUM_OHM) {
try {
queue.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
k++;
}
long endTime = System.currentTimeMillis();
System.out.println("ArrayBlockingQueue costTime = " + (endTime - startTime)
+ "ms");
}).start();
}
}
ArrayBlockingQueue costTime = 27912ms
public class DataConsumer implements EventHandler<Message> {
private long startTime;
private int i;
public DataConsumer() {
this.startTime = System.currentTimeMillis();
}
public void onEvent(Message data, long seq, boolean bool)
throws Exception {
i++;
if (i == Constants.EVENT_NUM_FM) {
long endTime = System.currentTimeMillis();
System.out.println("Disruptor costTime = " + (endTime - startTime) + "ms");
}
}
}
public class DisruptorSingle4Test {
public static void main(String[] args) {
int ringBufferSize = 65536;
final Disruptor<Message> disruptor = new Disruptor<>(
new EventFactory<Message>() {
@Override
public Message newInstance() {
return new Message();
}
},
ringBufferSize,
Executors.newSingleThreadExecutor(),
ProducerType.SINGLE,
new YieldingWaitStrategy()
);
DataConsumer consumer = new DataConsumer();
disruptor.handleEventsWith(consumer);
disruptor.start();
new Thread(()->{
RingBuffer<Message> ringBuffer = disruptor.getRingBuffer();
for (long i = 0; i < Constants.EVENT_NUM_FM; i++) {
long seq = ringBuffer.next();
Message data = ringBuffer.get(seq);
data.setId(i);
data.setName("c" + i);
ringBuffer.publish(seq);
}
}).start();
}
}
Disruptor costTime = 7458ms
第2节 并发编程框架核心讲解
2.1 Disruptor-QuickStart-基础元素工厂类
Disruptor 实践简介
·Martin Fowler 在自己网站上写了一篇 LMAX 架构的文章
·在文章中他介绍了 LMAX 是一种新型零售金融交易平台
·它能够以很低的延迟产生大量交易
·这个系统建立在 JVM 平台上,其核心是一个业务逻辑处理器
Disruptor 性能及核心
·它能够在一个线程里每秒处理 6 百万订单
·业务逻辑处理器完全是运行在内存中,它使用事件源驱动方式
·业务逻辑处理器的核心是 Disruptor
Disruptor 基本使用
·建立一个工厂 Event 类,用于创建 Event 类实例对象
·需要有一个监听事件类,用于处理数据(Event 类)
·实例化 Disruptor 实例,配置一系列参数,编写 Disruptor 核心组件
·编写生产者组件,向 Disruptor 容器中去投递数据
生成-消费模型
@Data
public class OrderEvent {
private long value;
}
基础元素工厂类
public class OrderEventFactory implements
EventFactory<OrderEvent> {
@Override
public OrderEvent newInstance() {
//
这个方法就是为了返回空的
OrderEvent
对象
return new OrderEvent();
}
}
消费端事件处理器
@Slf4j
public class OrderEventHandler implements
EventHandler<OrderEvent> {
@Override
public void onEvent(OrderEvent orderEvent, long l, boolean b)
throws Exception {
log.info("Customer event value:{}",
orderEvent.getValue());
}
}
生产者组件投递数据
@Data
@AllArgsConstructor
public class OrderEventProducer {
private RingBuffer<OrderEvent> ringBuffer;
public void setData(ByteBuffer byteBuffer){
// 1
在生产者发送消息的时候,首先需要从
ringBuffer
中获取一个
可用的序号
long sequence = ringBuffer.next();
try{
// 2
根据这个序号,找到具体
OrderEvent
元素,注意:此时获
取的
OrderEvent
对象是一个没有被赋值空对象
OrderEvent event = ringBuffer.get(sequence);
// 3
进行实际的赋值处理
event.setValue(byteBuffer.getLong(0));
} finally {
// 4
提交发布操作
ringBuffer.publish(sequence);
}
}
}
public class Main {
public static void main(String[] args) {
// 1.
实例化
Disruptor
对象
OrderEventFactory orderEventFactory = new
OrderEventFactory();
int ringBufferSize = 1024 * 1024;
ExecutorService executor =
Executors.newFixedThreadPool(Runtime.getRuntime().availablePro
cessors());
/**
* 1 eventFactory:
消息
(event)
工厂对象
剩余57页未读,继续阅读
资源评论
StoneChan
- 粉丝: 27
- 资源: 321
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- #P0015. 全排列 超级简单
- pta题库答案c语言之排序4统计工龄.zip
- pta题库答案c语言之树结构7堆中的路径.zip
- pta题库答案c语言之树结构3TreeTraversalsAgain.zip
- pta题库答案c语言之树结构2ListLeaves.zip
- pta题库答案c语言之树结构1树的同构.zip
- 基于C++实现民航飞行与地图简易管理系统可执行程序+说明+详细注释.zip
- pta题库答案c语言之复杂度1最大子列和问题.zip
- 三维装箱问题(Three-Dimensional Bin Packing Problem,3D-BPP)是一个经典的组合优化问题
- 以下是一些关于Linux线程同步的基本概念和方法.txt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功