日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java多線程之Disruptor入門

瀏覽:203日期:2022-08-13 13:31:52
一、Disruptor簡介

Disruptor目前是世界上最快的單機消息隊列,由英國外匯交易公司LMAX開發,研發的初衷是解決內存隊列的延遲問題(在性能測試中發現竟然與I/O操作處于同樣的數量級)。基于Disruptor開發的系統單線程能支撐每秒600萬訂單,2010年在QCon演講后,獲得了業界關注。2011年,企業應用軟件專家Martin Fowler專門撰寫長文介紹。同年它還獲得了Oracle官方的Duke大獎。目前,包括Apache Storm、Camel、Log4j 2在內的很多知名項目都應用了Disruptor以獲取高性能。

二、淺聊Disruptor的核心

Java多線程之Disruptor入門  

Disruptor維護了一個環形隊列RingBuffer,這個隊列本質上是一個首位相連的數組。相比于LinkedBlockdingQueue,RingBuffer的數組結構在查找方面效率更高。此外,LinkedBlockingQueue需要維護一個頭節點指針head和一個尾節點指針tail,而RingBuffer只需要維護一個sequence指向下一個可用的位置即可。所以從這兩點來說,RingBuffer比LinkedBlockingQueue要快。

三、Disruptor使用3.1 pom.xml

<dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>3.4.3</version></dependency>3.2 事件Event

Disruptor是基于事件的生產者消費者模型。其RingBuffer中存放的其實是將消息封裝成的事件。這里定義了一個LongEvent,表示消息隊列中存放的是long類型的數據。

public class LongEvent {private long value;public void set(long value) {this.value = value;} @Override public String toString() {return 'LongEvent{' +'value=' + value +’}’; }}3.3 EventFactory

實現EventFactory接口,定義Event工廠,用于填充隊列。Event工廠其實是為了提高Disruptor的效率,初始化的時候,會調用Event工廠,對RingBuffer進行內存的提前分配,GC的頻率會降低。

import com.lmax.disruptor.EventFactory;public class LongEventFactory implements EventFactory<LongEvent> {public LongEvent newInstance() {return new LongEvent();}}3.4 EventHandler

實現EventHandler接口,定義EventHandler(消費者),處理容器中的元素。

import com.lmax.disruptor.EventHandler;public class LongEventHandler implements EventHandler<LongEvent> {public void onEvent(LongEvent event, long sequence, boolean endOfBatch) {System.out.println('Event: ' + event + ', sequence: ' + sequence);}}3.5 使用Disruptor原始API發布消息

import cn.flying.space.disruptor.demo.LongEvent;import com.lmax.disruptor.RingBuffer;import java.nio.ByteBuffer;/** * 定義一個生產者,往Disruptor中投遞消息 */public class LongEventProducer { private RingBuffer<LongEvent> ringBuffer; public LongEventProducer(RingBuffer<LongEvent> ringBuffer) {this.ringBuffer = ringBuffer; } public void onData(ByteBuffer byteBuffer) {// 定位到下一個可存放的位置long sequence = ringBuffer.next();try { // 拿到該位置的event LongEvent event = ringBuffer.get(sequence); // 設置event的值 event.set(byteBuffer.getLong(0));} finally { // 發布 ringBuffer.publish(sequence);} }}import cn.flying.space.disruptor.demo.LongEvent;import cn.flying.space.disruptor.demo.LongEventFactory;import cn.flying.space.disruptor.demo.LongEventHandler;import com.lmax.disruptor.RingBuffer;import com.lmax.disruptor.dsl.Disruptor;import java.nio.ByteBuffer;import java.util.concurrent.Executors;public class TestMain { public static void main(String[] args) throws InterruptedException {// 定義event工廠LongEventFactory factory = new LongEventFactory();// ringBuffer長度int bufferSize = 1024;// 構造一個DisruptorDisruptor<LongEvent> disruptor = new Disruptor<>(factory, bufferSize, Executors.defaultThreadFactory());// 綁定handlerdisruptor.handleEventsWith(new LongEventHandler());// 啟動Disruptordisruptor.start();RingBuffer<LongEvent> ringBuffer = disruptor.getRingBuffer();LongEventProducer producer = new LongEventProducer(ringBuffer);ByteBuffer byteBuffer = ByteBuffer.allocate(8);for (long i = 0; true; i++) { byteBuffer.clear(); byteBuffer.putLong(i); // 投遞消息 producer.onData(byteBuffer); Thread.sleep(1000);} }}3.6 使用Translators發布消息

import cn.flying.space.disruptor.demo.LongEvent;import com.lmax.disruptor.EventTranslatorOneArg;import com.lmax.disruptor.RingBuffer;import java.nio.ByteBuffer;public class LongEventProducerUsingTranslator { private RingBuffer<LongEvent> ringBuffer; public LongEventProducerUsingTranslator(RingBuffer<LongEvent> ringBuffer) {this.ringBuffer = ringBuffer; } private static final EventTranslatorOneArg<LongEvent, ByteBuffer> TRANSLATOR = new EventTranslatorOneArg<LongEvent, ByteBuffer>() {@Overridepublic void translateTo(LongEvent longEvent, long l, ByteBuffer byteBuffer) { longEvent.set(byteBuffer.getLong(0));} }; public void onData(ByteBuffer byteBuffer) {ringBuffer.publishEvent(TRANSLATOR, byteBuffer); }}import cn.flying.space.disruptor.demo.LongEvent;import cn.flying.space.disruptor.demo.LongEventFactory;import cn.flying.space.disruptor.demo.LongEventHandler;import com.lmax.disruptor.RingBuffer;import com.lmax.disruptor.dsl.Disruptor;import com.lmax.disruptor.util.DaemonThreadFactory;import java.nio.ByteBuffer;/** * @author ZhangSheng * @date 2021-4-26 14:23 */public class TestMain { public static void main(String[] args) throws InterruptedException {LongEventFactory factory = new LongEventFactory();int bufferSize = 1024;Disruptor<LongEvent> disruptor = new Disruptor<>(factory, bufferSize, DaemonThreadFactory.INSTANCE);disruptor.handleEventsWith(new LongEventHandler());disruptor.start();RingBuffer<LongEvent> ringBuffer = disruptor.getRingBuffer();LongEventProducerUsingTranslator producer = new LongEventProducerUsingTranslator(ringBuffer);ByteBuffer byteBuffer = ByteBuffer.allocate(8);for (long i = 0L; true; i++) { byteBuffer.putLong(0, i); // 發布 producer.onData(byteBuffer); Thread.sleep(1000);} }}

到此這篇關于Java多線程之Disruptor入門的文章就介紹到這了,更多相關Java Disruptor入門內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品nxnn| 欧美日韩在线二区| 欧美一区=区| 欧美综合二区| 亚洲无线观看| 日韩精品国产欧美| 欧美亚洲一区二区三区| 国产毛片一区二区三区| 久久gogo国模啪啪裸体| 欧美日本一区| 国产精品4hu.www| 精品视频一区二区三区四区五区| 国产一区二区色噜噜| 日韩欧美精品一区| 蜜桃tv一区二区三区| 欧美在线亚洲综合一区| 99亚洲视频| 国产精品视区| 日韩高清三区| 国产一区二区三区四区大秀| 97精品视频在线看| 国产精品97| 97久久超碰| 亚洲伊人av| 麻豆久久精品| 欧美国产极品| 激情婷婷综合| 日韩福利视频一区| 国产一区二区三区亚洲| 亚洲黑丝一区二区| 亚洲色图国产| 精品一区二区三区中文字幕| 亚洲黄色免费看| 天堂成人免费av电影一区| 91成人在线网站| 日本精品不卡| 亚洲日产国产精品| 国产精品久久久久久久久久10秀| 日韩视频不卡| 欧美91在线|欧美| 午夜久久美女| 麻豆一区二区在线| 国产精品日韩欧美一区| 免费视频一区二区三区在线观看| 午夜视频精品| 国产欧美精品| 欧美特黄一级大片| 日韩中文av| av综合电影网站| 亚洲精选成人| 视频福利一区| 涩涩涩久久久成人精品| 精品久久久网| 国产精品美女久久久| 欧美日韩1区| 蜜桃成人av| 国产精品激情| 国产视频久久| 日韩电影二区| 欧美日韩一区二区三区不卡视频| 久久中文亚洲字幕| 免费看久久久| 国产美女一区| 亚洲深夜视频| 国产乱码精品| 日韩中文字幕91| 啪啪国产精品| 美女精品视频在线| 综合精品一区| 成人羞羞在线观看网站| 国产精品久久久久av蜜臀| 午夜在线播放视频欧美| 97精品国产一区二区三区| 日韩高清电影免费| 午夜亚洲精品| 天堂日韩电影| 九九九精品视频| 伊人久久一区| 欧美在线资源| 国产一区二区三区四区五区传媒| 亚洲精品视频一二三区| 99久久精品网站| 美女视频一区在线观看| 亚洲欧洲专区| 午夜久久99| 日韩免费福利视频| 麻豆久久久久久| 91嫩草精品| 热久久免费视频| 欧洲激情综合| 999国产精品999久久久久久| 精品午夜av| 日本午夜精品久久久久| 久久国产精品亚洲77777| 久久九九99| 丰满少妇一区| 国产精品qvod| 国产视频一区二| 日本a口亚洲| 在线观看亚洲精品福利片| 欧美91视频| 香蕉成人av| 中文在线а√在线8| 国产一区二区精品福利地址| 欧美日韩一区二区国产| 日本一区二区三区视频在线看| 三级一区在线视频先锋| 亚洲国产日韩欧美在线| 免费久久久久久久久| 欧美日韩色图| 欧美/亚洲一区| 亚洲精品2区| 在线观看免费一区二区| 精品91久久久久| 另类av一区二区| 国产亚洲福利| 亚洲一区欧美二区| 久久高清免费观看| 中文日韩欧美| 国产亚洲毛片在线| 在线 亚洲欧美在线综合一区| 国产精品av一区二区| 亚洲精品国产嫩草在线观看| 午夜av成人| 亚洲成人日韩| 9国产精品视频| 国产亚洲永久域名| 亚洲专区欧美专区| 丝袜美腿高跟呻吟高潮一区| 天堂成人免费av电影一区 | 日本精品久久| 日韩av网站在线免费观看| 婷婷五月色综合香五月| 日韩国产欧美在线视频| 久久精品72免费观看| 青青草国产成人99久久| 久久国产日韩欧美精品| 国产精品一区二区中文字幕| 精品中文字幕一区二区三区四区| 国产一区二区三区精品在线观看| 国产精品不卡| 日本精品不卡| 午夜久久黄色| 免费日本视频一区| 欧美亚洲国产日韩| 国产精品jk白丝蜜臀av小说| 黄色网一区二区| 日韩精品网站| 国产精品日韩欧美一区| 婷婷五月色综合香五月| 欧美日一区二区在线观看| 久久精品理论片| 色吊丝一区二区| 蜜臀av性久久久久蜜臀aⅴ流畅| 97久久精品| 黄毛片在线观看| 狠狠爱成人网| 日韩福利在线观看| 精品视频国产| 国内精品福利| 日韩精品五月天| 国产999精品在线观看| 久久亚洲成人| 亚洲精品乱码久久久久久蜜桃麻豆| 国产精品亚洲人成在99www| 精品视频在线一区二区在线| 欧美成人精品三级网站| 男人天堂欧美日韩| 国产免费av国片精品草莓男男| 亚洲欧洲高清| 免费在线观看视频一区| 欧美激情精品| 欧美.日韩.国产.一区.二区| 中文字幕日韩亚洲| 精品久久影院| 国产精品老牛| 另类综合日韩欧美亚洲| 91精品一区国产高清在线gif| 亚洲一级大片| 国产在线日韩精品| 西西人体一区二区| 久久丁香四色| 9国产精品视频| 欧美国产视频| 中文一区在线| 成人在线超碰| 首页欧美精品中文字幕| 国产精品成人a在线观看| 99热精品在线观看| 久久69成人| 免费日韩一区二区| 精品国产黄a∨片高清在线| 合欧美一区二区三区| 卡一卡二国产精品| 国产模特精品视频久久久久| 欧美另类中文字幕 | 久久亚洲电影| 超碰99在线| 国产欧美日韩在线观看视频| 欧美精品黄色|