1. 程式人生 > >disruptor實操作手冊(一)

disruptor實操作手冊(一)

disruptor是一個JAVA高效能併發框架,為什麼快,原理是什麼這類的話題百度有很多文件描述,這裡不再重複。

本文的目的是把實際如何使用這一框架解決實際工作中遇到的問題儘可能的詳細介紹。

本文使用的disruptor版本是3.3.2。

新建一個簡單的disruptor工程。

一,構建工程

普通java工程,web工程都可以。這裡例項使用java工程。

新建一個普通的maven工程,在pom檔案裡寫入如下依賴

</span><dependency>
			<groupId>com.lmax</groupId>
			<artifactId>disruptor</artifactId>
			<version>3.3.2</version>
		</dependency>

工程build之後,即可在依賴裡面看到disruptor的依賴包。

二,基本程式碼編寫

2.1,首先先建立一個Event類。該類的作用就用來傳遞資料。如下:

public class LongEvent {
	private long value;
    public long getValue() { 
        return value; 
    } 
 
    public void setValue(long value) { 
        this.value = value; 
    } 
}
其實跟普通的java bean 沒有什麼區別,不用整合任何父類,也不需要實現任何介面。

2.2,建立EventFactory介面的實現類

import com.lmax.disruptor.EventFactory;

public class LongEventFactory implements EventFactory<LongEvent> {

	@Override
	public LongEvent newInstance() {
		return new LongEvent(); 
	}

}
如上所示,該類只需要實現一個方法,用來建立一個Event類並返回。

2.3,再來建立一個事件實現類,這裡我們預設建立一個 EventHandler;

import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.lmax.disruptor.EventHandler;

public class LongEventHandler implements EventHandler<LongEvent> {
	private static final Logger LOG =  LoggerFactory
			.getLogger(LongEventHandler.class);
	@Override
	public void onEvent(LongEvent longEvent, long sequence, boolean endOfBatch)
			throws Exception {
		boolean chk = true;
		long l = longEvent.getValue();
		LOG.info("開始處理" + l + "");
		Date dtStart = new Date();
		
		while(chk){
			Date dt = new Date();
			if(dt.getTime() - dtStart.getTime() >=20){
				chk = false;
				LOG.info("結束處理" + l + "");
			}
		}
	}
}
 該類實現了EventHandler介面,在收到Event傳遞來的資料後,做了一個迴圈處理。

2.4,最後,我們來建立一個disruptor,來啟動事件

public static void main(String[] args) throws InterruptedException {
		Executor executor = Executors.newCachedThreadPool();
		LongEventFactory factory = new LongEventFactory();
		int bufferSize = 1024;
		Disruptor<LongEvent> disruptor = new Disruptor<LongEvent>(factory,
				bufferSize, executor, ProducerType.SINGLE,
				new SleepingWaitStrategy());

		disruptor.handleEventsWith(new LongEventHandler() );
		disruptor.start();
		// 啟動
		RingBuffer<LongEvent> ringBuffer = disruptor.getRingBuffer();
		LongEventProducer producer = new LongEventProducer(ringBuffer);
		for (long l = 0; l < 3; l++) {
			long sequence = ringBuffer.next();
			try {
				LongEvent event = ringBuffer.get(sequence);
				event.setValue(l);
			} finally {
				// 釋出事件
				ringBuffer.publish(sequence);
			}
			Thread.sleep(1000);
		}
	}
執行下看看結果:
2015-06-04 23:18:12,146 INFO [com.xuyang.test.disruptor.LongEventHandler] batch開始處理0
2015-06-04 23:18:12,168 INFO [com.xuyang.test.disruptor.LongEventHandler] batch結束處理0
2015-06-04 23:18:13,145 INFO [com.xuyang.test.disruptor.LongEventHandler] batch開始處理1
2015-06-04 23:18:13,165 INFO [com.xuyang.test.disruptor.LongEventHandler] batch結束處理1
2015-06-04 23:18:14,149 INFO [com.xuyang.test.disruptor.LongEventHandler] batch開始處理2
2015-06-04 23:18:14,169 INFO [com.xuyang.test.disruptor.LongEventHandler] batch結束處理2

好了,一個簡單的disruptor的工程到這裡就已經完工了。

相關推薦

disruptor操作手冊

disruptor是一個JAVA高效能併發框架,為什麼快,原理是什麼這類的話題百度有很多文件描述,這裡不再重複。 本文的目的是把實際如何使用這一框架解決實際工作中遇到的問題儘可能的詳細介紹。 本文使用的disruptor版本是3.3.2。 新建一個簡單的disruptor

觀察者模式C#現實例

upd 添加 add mov user remove 定義 更新 鬧鐘 1.用例情景   1)定義一個鬧鐘(目標類),裏面我們感興趣的是時間值times,當times大於9.15時,通知觀察者。   2)定義兩個觀察者,userA,userB,當收到times值時,作出判斷

Apache Shiro 使用手冊Shiro架構介紹

springmvc+mybatis dubbo+zookeeper restful redis分布式緩存 shiro kafka 一、什麽是Shiro Apache Shiro是一個強大易用的Java安全框架,提供了認證、授權、加密和會話管理等功能: 認證 - 用戶身份識別,常被稱為用戶“

30天自制操作系統從計算機結構到匯編程序入門

ios 是什麽 program 信號 解釋 根目錄 自己 保存 音樂 學習這本書不代表我要親自動手把這本書中的代碼敲一遍哦,只是借機來學習一下操作系統。之前有段時間也在看操作系統的知識,怎麽說呢之前的看的書都是偏講理論多一些,對於我這個非科班出身的來說,由於之前的計算機知識

python記錄—入門到實踐—字符串操作

span java、 浮點 大寫 數位 tab cnblogs 保留小數 字符串操作 我就跟著書學,總結執行要記錄的,不要覺得簡單就不去試一試,敲一敲代碼。執行力是成為好的程序員的寶劍。如果你是新手在掌握其他的語言情況下比如java、c或者php等等任意一種基本語法,程序都

原子操作原子操作類詳細介紹

expected 文章 span del 也有 pair 上一個 ride 操作類 引言 ??Java從JDK1.5開始提供了java.util.concurrent.atomic包,方便程序員在多線程環境下,無鎖的進行原子操作。原子變量的底層使用了處理器提供的原子指令,但

Python操作MySQL PyMysql篇

pymysql mysqldb python mysql pymsql是Python中操作MySQL的模塊,其使用方法和MySQLdb幾乎相同,但是mysqldb不支持Python3 下載安裝 pip3 install pymysql 使用操作 1. 執行sql #!/usr/bin/env p

python之操作mysql

mod 它的 utf8 連接數 mode char PE class 是個 使用python操作mysql的思路: 1. 連接數據庫:ip,端口號,密碼,賬號,數據庫 2. 建立遊標 3.執行sql語句 4.獲取執行結果 5.關閉遊標,關閉連接 conn = pymysql

Linux shell腳本例——由淺入深

auth 變量 tro The amp 5.6 james pre start Linux shell基礎篇 終端打印 #!/bin/bash #The printf of Linux termnal,Include "echo,printf" #author by w

python操作json

數字 其他 是不是 print employee ict 語法規則 浮點 3.0 Python 操作jsonJson語法規則:數據在名稱/值對中數據由逗號分隔花括號保存對象方括號保存數組Json字符串本質上是一個字符串,用單引號表示 Json數據的書寫格式名稱--值對,包括

DOM操作總結

UNC 標簽 頁面加載 當前 urn 對象 自己的 var ole (一)innerText 凡是成對的標簽,中間的文本內容,設置的時候,都是用innerText這個屬性方法 (二)在某個元素的事件中,自己的事件中的this就是當前的這個元素對象 var btn=ducou

Python 二級模擬操作

中國 正方 range 進制數 存儲 字符 light 包含 pri 1.計算下列式子,結果保留小數點後保留3位 代碼: >>> x = pow((3**4 + 5*(6**7))/8, 0.5) >>> print("%.

node總結之檔案操作系列

Node.js 提供一組類似 UNIX(POSIX)標準的檔案操作API,我們來看下Node 匯入檔案系統模組(fs)語法,如下: var fs = require("fs") Node.js 檔案系統(fs 模組)模組中的方法均有非同步和同步版本,例如讀取檔案內容的函式有非同步的 fs

MyHDL中文手冊——概述

硬體開源程式設計利器MyHDL簡介 建模 模擬與驗證 轉換為Verilog語言與VHDL語言 (本系列基於MyHDL 0.10.0 版 on Python3) MyHDL專案的目標是通過python語言的優雅和簡潔性來增強硬體設計者的能

基於Curator操作ZooKeeper-基本操作

Java原生API操作ZooKeeper可參看: Java原生API操作Zookeeper(一) Java原生API操作Zookeeper(二) 相關內容: 基於Curator操作ZooKeeper(二)-Watcher操作 基於Curator操作ZooKeeper(二)-W

嵌入式Linux應用開發完全手冊嵌入式Linux基礎知識

嵌入式Linux應用開發完全手冊 3 嵌入式Linux基礎知識 3.1 交叉編譯工具 編譯工具鏈,編譯工作由幾個步驟完成,分別用到了不同的工具 PC端應用 gcc ld objcopy

嵌入式linux應用開發完全手冊

第一篇 嵌入式Linux開發環境構建 1.1.2 嵌入式發展 SCM(Single Chip Microcomputer)微控制器; MCU(Micro Controller Unit)微控制器; SoC(System on a Chip):系統級晶片,在一個晶片上由於廣泛使用

python3入門教程操作資料庫

概述   最近在準備寫一個爬蟲的練手專案,基本想法是把某新聞網站的內容分類爬取下來,儲存至資料庫,再通過介面對外輸出(提供後臺查詢介面)。那麼問題就來了,python到底是怎麼去操作資料庫的呢?我們今天就來研究下。   準備 我這邊資料庫使用的是mysql5.7,python去操作mysql

Git介紹及常用操作演示--技術流ken

Git介紹及常用操作演示(一)--技術流ken   Git介紹    Git(讀音為/gɪt/。)是一個開源的分散式版本控制系統,可以有效、高速的處理從很小到非常大的專案版本管理。 Git 是 Linus Torvalds 為了幫助管理 Linux 核心

Photoshop操作總結

第一次用ps畫圖        在學習ps之前,我用ps軟體畫了一個圖(有些不忍直視嘻嘻),在學完之後,可以作一個比較,希望自己會有很大的進步。 透視 定義        繪畫理論