com.lmax disruptor 3.3.4
public class PCData {
private long value; public long getValue() { return value; } public void setValue(long value) { this.value = value; }
}
public class PCDataFactory implements EventFactory
@Override public PCData newInstance() { return new PCData(); }
}
public class Producer {
private final RingBufferringBuffer; public Producer(RingBuffer ringBuffer) { this.ringBuffer = ringBuffer; } public void pushData(ByteBuffer byteBuffer){ long sequence = ringBuffer.next(); try{ PCData event = ringBuffer.get(sequence); event.setValue(byteBuffer.getLong(0)); }finally { ringBuffer.publish(sequence); } }
}
public class Consumer implements WorkHandler
@Override public void onEvent(PCData pcData) throws Exception { System.out.println(Thread.currentThread().getName()+"Event:--"+pcData.getValue()*pcData.getValue()+"--"); }
}
public class App {
public static void main(String[] args) throws InterruptedException { ExecutorService executorService = Executors.newCachedThreadPool(); PCDataFactory factory = new PCDataFactory(); int bufferSize = 1024; DisruptordataDisruptor = new Disruptor (factory,bufferSize,executorService, ProducerType.MULTI,new BlockingWaitStrategy()); dataDisruptor.handleEventsWithWorkerPool( new Consumer(), new Consumer(), new Consumer(), new Consumer() ); dataDisruptor.start(); RingBuffer ringBuffer = dataDisruptor.getRingBuffer(); Producer producer = new Producer(ringBuffer); ByteBuffer byteBuffer = ByteBuffer.allocate(8); for(long l=0;true;l++){ byteBuffer.putLong(0,l); producer.pushData(byteBuffer); Thread.sleep(100); System.out.println("add data"+l); } }
}
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/74762.html
摘要:我們知道是一個隊(duì)列,生產(chǎn)者往隊(duì)列里發(fā)布一項(xiàng)事件或稱之為消息也可以時(shí),消費(fèi)者能獲得通知如果沒有事件時(shí),消費(fèi)者被堵塞,直到生產(chǎn)者發(fā)布了新的事件。實(shí)戰(zhàn)本文先不具體去闡述的工作具體原理,只是簡單地將與其整合。 什么是Disruptor 從功能上來看,Disruptor 是實(shí)現(xiàn)了隊(duì)列的功能,而且是一個有界隊(duì)列。那么它的應(yīng)用場景自然就是生產(chǎn)者-消費(fèi)者模型的應(yīng)用場合了??梢阅?JDK 的 Block...
摘要:當(dāng)多線程修改互相獨(dú)立的變量時(shí),如果這些變量共享同一個緩存行,就會無意中影響彼此的性能,這就是偽共享。 序 本文整理了Single Producer/Consumer lock free Queue step by step這篇文章里頭關(guān)于高性能的SPSC無鎖隊(duì)列使用遵循的幾個原則: 單寫原則 使用lazySet替代volatile set 使用位運(yùn)算替代取模運(yùn)算 避免偽共享 減少緩存...
摘要:一個是線程退出條件,一個是異常處理情況。很方便,每個線程一份數(shù)據(jù),也很安全,但要注意內(nèi)存泄露。線程池參數(shù)包最常用的就是線程池,平常工作建議直接使用線程池,類就可以降低優(yōu)先級了。在線程池的構(gòu)造參數(shù)中,我們使用的隊(duì)列,一定要注意其特性和邊界。 我曾經(jīng)對自己的小弟說,如果你實(shí)在搞不清楚什么時(shí)候用HashMap,什么時(shí)候用ConcurrentHashMap,那么就用后者,你的代碼bug會很少。...
摘要:分段策略嘗試自旋此,然后調(diào)用次,如果經(jīng)過這兩百次的操作還未獲取到任務(wù),就會嘗試階段性掛起自身線程。 零 前期準(zhǔn)備 0 FBI WARNING 文章異常啰嗦且繞彎。 1 版本 Disruptor 版本 : Disruptor 3.4.2 IDE : idea 2018.3 JDK 版本 : OpenJDK 11.0.1 2 Disruptor 簡介 高性能線程間消息隊(duì)列框架 Disrup...
摘要:發(fā)現(xiàn)這是的一個堆棧,前段時(shí)間正好解決過一個由于隊(duì)列引起的一次強(qiáng)如也發(fā)生內(nèi)存溢出沒想到又來一出。因此初步判斷為大量線程執(zhí)行函數(shù)之后互相競爭導(dǎo)致使用率增高,而通過對堆棧發(fā)現(xiàn)是和使用有關(guān)。 showImg(https://segmentfault.com/img/remote/1460000017395756?w=1816&h=1080); 前言 到了年底果然都不太平,最近又收到了運(yùn)維報(bào)警:...
閱讀 2952·2021-11-23 09:51
閱讀 3471·2021-11-22 09:34
閱讀 3374·2021-10-27 14:14
閱讀 1599·2019-08-30 15:55
閱讀 3406·2019-08-30 15:54
閱讀 1130·2019-08-30 15:52
閱讀 1944·2019-08-30 12:46
閱讀 2899·2019-08-29 16:11