1. import java.util.concurrent.atomic.AtomicInteger;
  2.  
  3. /**
  4. * Disruptor中的 Event
  5. * @author Alienware
  6. *
  7. */
  8. public class Trade {
  9.  
  10. private String id;
  11. private String name;
  12. private double price;
  13. //在并发时实现线程安全
  14. private AtomicInteger count = new AtomicInteger(0);
  15.  
  16. public Trade() {
  17. }
  18. public String getId() {
  19. return id;
  20. }
  21. public void setId(String id) {
  22. this.id = id;
  23. }
  24. public String getName() {
  25. return name;
  26. }
  27. public void setName(String name) {
  28. this.name = name;
  29. }
  30. public double getPrice() {
  31. return price;
  32. }
  33. public void setPrice(double price) {
  34. this.price = price;
  35. }
  36. public AtomicInteger getCount() {
  37. return count;
  38. }
  39. public void setCount(AtomicInteger count) {
  40. this.count = count;
  41. }
  42. }

  

  1. import java.util.Random;
  2. import java.util.concurrent.CountDownLatch;
  3.  
  4. import com.lmax.disruptor.EventTranslator;
  5. import com.lmax.disruptor.dsl.Disruptor;
  6.  
  7. public class TradePushlisher implements Runnable {
  8.  
  9. private Disruptor<Trade> disruptor;
  10. private CountDownLatch latch;
  11.  
  12. private static int PUBLISH_COUNT = 1;
  13.  
  14. public TradePushlisher(CountDownLatch latch, Disruptor<Trade> disruptor) {
  15. this.disruptor = disruptor;
  16. this.latch = latch;
  17. }
  18.  
  19. public void run() {
  20. TradeEventTranslator eventTranslator = new TradeEventTranslator();
  21. for(int i =0; i < PUBLISH_COUNT; i ++){
  22. //新的提交任务的方式
  23. disruptor.publishEvent(eventTranslator);
  24. }
  25. latch.countDown();
  26. }
  27. }
  28.  
  29. class TradeEventTranslator implements EventTranslator<Trade> {
  30.  
  31. private Random random = new Random();
  32.  
  33. public void translateTo(Trade event, long sequence) {
  34. this.generateTrade(event);
  35. }
  36.  
  37. private void generateTrade(Trade event) {
  38. event.setPrice(random.nextDouble() * 9999);
  39. }
  40. }

  

  1. import com.lmax.disruptor.EventHandler;
  2. import com.lmax.disruptor.WorkHandler;
  3.  
  4. public class Handler1 implements EventHandler<Trade>, WorkHandler<Trade>{
  5.  
  6. //EventHandler
  7. public void onEvent(Trade event, long sequence, boolean endOfBatch) throws Exception {
  8. this.onEvent(event);
  9. }
  10.  
  11. //WorkHandler
  12. public void onEvent(Trade event) throws Exception {
  13. System.err.println("handler 1 : SET NAME");
  14. Thread.sleep(1000);
  15. event.setName("H1");
  16. }
  17. }

  

  1. import java.util.UUID;
  2. import com.lmax.disruptor.EventHandler;
  3.  
  4. public class Handler2 implements EventHandler<Trade> {
  5.  
  6. public void onEvent(Trade event, long sequence, boolean endOfBatch) throws Exception {
  7. System.err.println("handler 2 : SET ID");
  8. Thread.sleep(2000);
  9. event.setId(UUID.randomUUID().toString());
  10. }
  11. }

  

  1. import com.lmax.disruptor.EventHandler;
  2.  
  3. public class Handler3 implements EventHandler<Trade> {
  4.  
  5. public void onEvent(Trade event, long sequence, boolean endOfBatch) throws Exception {
  6. System.err.println("handler 3 : NAME: "
  7. + event.getName()
  8. + ", ID: "
  9. + event.getId()
  10. + ", PRICE: "
  11. + event.getPrice()
  12. + " INSTANCE : " + event.toString());
  13. }
  14. }

  

  1. import com.lmax.disruptor.EventHandler;
  2.  
  3. public class Handler4 implements EventHandler<Trade> {
  4.  
  5. public void onEvent(Trade event, long sequence, boolean endOfBatch) throws Exception {
  6. System.err.println("handler 4 : SET PRICE");
  7. Thread.sleep(1000);
  8. event.setPrice(17.0);
  9. }
  10. }

  

  1. import com.lmax.disruptor.EventHandler;
  2.  
  3. public class Handler5 implements EventHandler<Trade> {
  4. public void onEvent(Trade event, long sequence, boolean endOfBatch) throws Exception {
  5. System.err.println("handler 5 : GET PRICE: " + event.getPrice());
  6. Thread.sleep(1000);
  7. event.setPrice(event.getPrice() + 3.0);
  8. }
  9. }

  

  1. import java.util.concurrent.CountDownLatch;
  2. import java.util.concurrent.ExecutorService;
  3. import java.util.concurrent.Executors;
  4.  
  5. import com.lmax.disruptor.BusySpinWaitStrategy;
  6. import com.lmax.disruptor.EventFactory;
  7. import com.lmax.disruptor.RingBuffer;
  8. import com.lmax.disruptor.dsl.Disruptor;
  9. import com.lmax.disruptor.dsl.EventHandlerGroup;
  10. import com.lmax.disruptor.dsl.ProducerType;
  11.  
  12. public class Main {
  13. @SuppressWarnings("unchecked")
  14. public static void main(String[] args) throws Exception {
  15.  
  16. //构建一个线程池用于提交任务
  17. ExecutorService es1 = Executors.newFixedThreadPool(1);
  18.  
  19. ExecutorService es2 = Executors.newFixedThreadPool(5);
  20. //1 构建Disruptor
  21. Disruptor<Trade> disruptor = new Disruptor<Trade>(
  22. new EventFactory<Trade>() {
  23. public Trade newInstance() {
  24. return new Trade();
  25. }
  26. },
  27. 1024*1024,
  28. es2,
  29. ProducerType.SINGLE,
  30. new BusySpinWaitStrategy());
  31.  
  32. //2 把消费者设置到Disruptor中 handleEventsWith
  33.  
  34. //2.1 串行操作:
  35.  
  36. disruptor
  37. .handleEventsWith(new Handler1())
  38. .handleEventsWith(new Handler2())
  39. .handleEventsWith(new Handler3());
  40.  
  41. //2.2 并行操作: 可以有两种方式去进行
  42. //1 handleEventsWith方法 添加多个handler实现即可
  43. //2 handleEventsWith方法 分别进行调用
  44.  
  45. disruptor.handleEventsWith(new Handler1(), new Handler2(), new Handler3());
  46. disruptor.handleEventsWith(new Handler2());
  47. disruptor.handleEventsWith(new Handler3());
  48.  
  49. //2.3 菱形操作 (一)
  50.  
  51. disruptor.handleEventsWith(new Handler1(), new Handler2())
  52. .handleEventsWith(new Handler3());
  53.  
  54. //2.3 菱形操作 (二)
  55.  
  56. EventHandlerGroup<Trade> ehGroup = disruptor.handleEventsWith(new Handler1(), new Handler2());
  57. ehGroup.then(new Handler3());
  58.  
  59. //2.4 六边形操作
  60. Handler1 h1 = new Handler1();
  61. Handler2 h2 = new Handler2();
  62. Handler3 h3 = new Handler3();
  63. Handler4 h4 = new Handler4();
  64. Handler5 h5 = new Handler5();
  65. disruptor.handleEventsWith(h1, h4);
  66. disruptor.after(h1).handleEventsWith(h2);
  67. disruptor.after(h4).handleEventsWith(h5);
  68. disruptor.after(h2, h5).handleEventsWith(h3);
  69.  
  70. //3 启动disruptor
  71. RingBuffer<Trade> ringBuffer = disruptor.start();
  72.  
  73. //设置唤醒的次数
  74. CountDownLatch latch = new CountDownLatch(1);
  75.  
  76. long begin = System.currentTimeMillis();
  77.  
  78. es1.submit(new TradePushlisher(latch, disruptor));
  79.  
  80. latch.await(); //进行向下
  81.  
  82. disruptor.shutdown();
  83. es1.shutdown();
  84. es2.shutdown();
  85. System.err.println("总耗时: " + (System.currentTimeMillis() - begin));
  86.  
  87. }
  88. }

  多生产者模型:

多消费者:

  1. import java.util.concurrent.atomic.AtomicInteger;
  2.  
  3. public class Order {
  4.  
  5. private String id;
  6. private String name;
  7. private double price;
  8.  
  9. public Order() {
  10. }
  11. public String getId() {
  12. return id;
  13. }
  14. public void setId(String id) {
  15. this.id = id;
  16. }
  17. public String getName() {
  18. return name;
  19. }
  20. public void setName(String name) {
  21. this.name = name;
  22. }
  23. public double getPrice() {
  24. return price;
  25. }
  26. public void setPrice(double price) {
  27. this.price = price;
  28. }
  29. }

  

  1. import com.lmax.disruptor.RingBuffer;
  2.  
  3. public class Producer {
  4. private RingBuffer<Order> ringBuffer;
  5.  
  6. public Producer(RingBuffer<Order> ringBuffer) {
  7. this.ringBuffer = ringBuffer;
  8. }
  9.  
  10. public void sendData(String uuid) {
  11. long sequence = ringBuffer.next();
  12. try {
  13. Order order = ringBuffer.get(sequence);
  14. order.setId(uuid);
  15. } finally {
  16. ringBuffer.publish(sequence);
  17. }
  18. }
  19. }

  

  1. import java.util.Random;
  2. import java.util.concurrent.atomic.AtomicInteger;
  3.  
  4. import com.lmax.disruptor.WorkHandler;
  5.  
  6. //消费者实现多消费的接口
  7. public class Consumer implements WorkHandler<Order> {
  8.  
  9. private String comsumerId;
  10.  
  11. private static AtomicInteger count = new AtomicInteger(0);
  12.  
  13. private Random random = new Random();
  14.  
  15. public Consumer(String comsumerId) {
  16. this.comsumerId = comsumerId;
  17. }
  18.  
  19. public void onEvent(Order event) throws Exception {
  20. Thread.sleep(1 * random.nextInt(5));
  21. System.err.println("当前消费者: " + this.comsumerId + ", 消费信息ID: " + event.getId());
  22. count.incrementAndGet();
  23. }
  24.  
  25. public int getCount(){
  26. return count.get();
  27. }
  28. }

  

  1. import java.util.UUID;
  2. import java.util.concurrent.CountDownLatch;
  3. import java.util.concurrent.Executors;
  4.  
  5. import com.lmax.disruptor.EventFactory;
  6. import com.lmax.disruptor.ExceptionHandler;
  7. import com.lmax.disruptor.RingBuffer;
  8. import com.lmax.disruptor.SequenceBarrier;
  9. import com.lmax.disruptor.WorkerPool;
  10. import com.lmax.disruptor.YieldingWaitStrategy;
  11. import com.lmax.disruptor.dsl.ProducerType;
  12.  
  13. public class Main {
  14.  
  15. //1 创建RingBuffer
  16. RingBuffer<Order> ringBuffer =
  17. RingBuffer.create(ProducerType.MULTI,
  18. new EventFactory<Order>() {
  19. public Order newInstance() {
  20. return new Order();
  21. }
  22. },
  23. 1024*1024,
  24. new YieldingWaitStrategy());
  25.  
  26. //2 通过ringBuffer 创建一个屏障
  27. SequenceBarrier sequenceBarrier = ringBuffer.newBarrier();
  28.  
  29. //3 创建多个消费者数组:
  30. Consumer[] consumers = new Consumer[10];
  31. for(int i = 0; i < consumers.length; i++) {
  32. consumers[i] = new Consumer("C" + i);
  33. }
  34.  
  35. //4 构建多消费者工作池
  36. WorkerPool<Order> workerPool = new WorkerPool<Order>(
  37. ringBuffer,
  38. sequenceBarrier,
  39. new EventExceptionHandler(), //在失败的时候怎么处理
  40. consumers);
  41.  
  42. //5 设置多个消费者的sequence序号 用于单独统计消费进度, 并且设置到ringbuffer中
  43. ringBuffer.addGatingSequences(workerPool.getWorkerSequences());
  44.  
  45. //6 启动workerPool
  46. workerPool
  47. .start(Executors.newFixedThreadPool(5));
  48.  
  49. final CountDownLatch latch = new CountDownLatch(1);
  50.  
  51. for(int i = 0; i < 100; i++) {
  52. final Producer producer = new Producer(ringBuffer);
  53. new Thread(new Runnable() {
  54. public void run() {
  55. try {
  56. latch.await();
  57. } catch (Exception e) {
  58. e.printStackTrace();
  59. }
  60. for(int j = 0; j<100; j++) {
  61. producer.sendData(UUID.randomUUID().toString());
  62. }
  63. }
  64. }).start();
  65. }
  66.  
  67. Thread.sleep(2000);
  68. System.err.println("----------线程创建完毕,开始生产数据----------");
  69. latch.countDown();
  70.  
  71. Thread.sleep(10000);
  72.  
  73. System.err.println("任务总数:" + consumers[2].getCount());
  74. }
  75.  
  76. static class EventExceptionHandler implements ExceptionHandler<Order> {
  77. @Override
  78. public void handleEventException(Throwable ex, long sequence, Order event) {
  79. }
  80. @Override
  81. public void handleOnStartException(Throwable ex) {
  82. }
  83. @Override
  84. public void handleOnShutdownException(Throwable ex) {
  85. }
  86. }
  87. }

  

读读共享、读写互斥、写写互斥

LockSupport :

  1. Thread A = new Thread(new Runnable() {
  2.  
  3. @Override
  4. public void run() {
  5. int sum = 0;
  6. for(int i =0; i < 10; i ++){
  7. sum += i;
  8. }
  9. try {
  10. Thread.sleep(4000);
  11. } catch (InterruptedException e) {
  12. e.printStackTrace();
  13. }
  14. LockSupport.park(); //后执行
  15. System.err.println("sum: " + sum);
  16. }
  17. });
  18.  
  19. A.start();
  20.  
  21. Thread.sleep(1000);
  22.  
  23. LockSupport.unpark(A); //先执行
  24.  
  25. Executors.newCachedThreadPool();
  26. Executors.newFixedThreadPool(10);
  27.  
  28. ThreadPoolExecutor pool = new ThreadPoolExecutor(5,
  29. Runtime.getRuntime().availableProcessors() * 2,
  30. 60,
  31. TimeUnit.SECONDS,
  32. new ArrayBlockingQueue<>(200),
  33. new ThreadFactory() {
  34. @Override
  35. public Thread newThread(Runnable r) {
  36. Thread t = new Thread(r);
  37. t.setName("order-thread");
  38. if(t.isDaemon()) {
  39. t.setDaemon(false);
  40. }
  41. if(Thread.NORM_PRIORITY != t.getPriority()) {
  42. t.setPriority(Thread.NORM_PRIORITY);
  43. }
  44. return t;
  45. }
  46. },
  47. new RejectedExecutionHandler() {
  48. @Override
  49. public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
  50. System.err.println("拒绝策略:" + r);
  51. }
  52. });
  53.  
  54. ReentrantLock reentrantLock = new ReentrantLock(true);

  线程池:

  1. ThreadPoolExecutor pool=new ThreadPoolExecutor(
  2. 5,
  3. Runtime.getRuntime().availableProcessors()*2,
  4. 60,
  5. TimeUnit.SECONDS,
  6. new ArrayBlockingQueue<>(200),
  7. new ThreadFactory() {
  8.  
  9. @Override
  10. public Thread newThread(Runnable r) {
  11. Thread thread=new Thread(r);
  12. thread.setName("order-thread");
  13. if(thread.isDaemon()){
  14. thread.setDaemon(false);
  15. }
  16. if(Thread.NORM_PRIORITY!=thread.getPriority()){
  17. thread.setPriority(Thread.NORM_PRIORITY);
  18. }
  19. return thread;
  20. }
  21. },
  22. new RejectedExecutionHandler() {
  23.  
  24. @Override
  25. public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
  26. System.err.println("拒绝策略:"+r);
  27. }
  28. });

  AQS架构:

JAVA线程Disruptor核心链路应用(八)的更多相关文章

  1. disruptor 核心链路应用场景

    核心链路一般比较复杂并且需要考虑:服务之间相互依赖性.流程能够走完.人员的变动等情况 要考虑:兜底.补偿. 常见解决方案是:1)完全解耦 2)模板模式 其他解决方案:1)有限状态机框架:spring- ...

  2. Java并发编程:Java线程池核心ThreadPoolExecutor的使用和原理分析

    目录 引出线程池 Executor框架 ThreadPoolExecutor详解 构造函数 重要的变量 线程池执行流程 任务队列workQueue 任务拒绝策略 线程池的关闭 ThreadPoolEx ...

  3. Java线程池核心原理剖析

    在系统开发时,我们经常会遇到“池”的概念.使用池一种以空间换时间的做法,通常在内存中事先保存一系列整装待命的对象,以供后期供其他对象随时调用.常见的池有:数据库连接池,socket连接池,线程池等.今 ...

  4. Java线程Thread的状态解析以及状态转换分析 多线程中篇(七)

    线程与操作系统中线程(进程)的概念同根同源,尽管千差万别. 操作系统中有状态以及状态的切换,Java线程中照样也有. State 在Thread类中有内部类 枚举State,用于抽象描述Java线程的 ...

  5. 关于CPU核心,线程,进程,并发,并行,及java线程之间的关系

    前言:作为一个转行java的小白,一直搞不清楚java中的多线程.于是来梳理一下关于CPU核心,线程,进程,并发,并行,及java线程之间的关系, 1.CPU角度来看: 我们以Intel的Core i ...

  6. Java 线程池框架核心代码分析--转

    原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...

  7. Java 线程池框架核心代码分析

    前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和资源消耗都是很高的.线程池应运而生,成为我们管理线程的利器.Java 通过Executor接口,提供了一种标准的方法将任务的提交过 ...

  8. java线程池技术(二): 核心ThreadPoolExecutor介绍

    版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程池技术属于比较"古老"而又比较基础的技术了,本篇博客主要作用是个人技术梳理,没什么新玩意. 一.Java线程池技术的 ...

  9. Netty核心概念(7)之Java线程池

    1.前言 本章本来要讲解Netty的线程模型的,但是由于其是基于Java线程池设计而封装的,所以我们先详细学习一下Java中的线程池的设计.之前也说过Netty5被放弃的原因之一就是forkjoin结 ...

随机推荐

  1. 阿里云部署自己的web服务器

    阿里云部署自己的web服务器 [外链图片转存失败(img-GIKNTPPx-1564287221547)(https://upload-images.jianshu.io/upload_images/ ...

  2. Python之NumPy(axis=0/1/2...)的透彻理解

    https://blog.csdn.net/sky_kkk/article/details/79725646 numpy中axis取值的说明首先对numpy中axis取值进行说明:一维数组时axis= ...

  3. 使用localstorage.setItem()存储对象

    使用localstorage.setItem(name,value)存储JSON对象时会发现浏览器存储的内容为[object,object],并不是我们想要的内容,这是因为我们在存储的时候没有进行类型 ...

  4. Hadoop平台上HDFS和MapReduce的功能

    1.用自己的话阐明Hadoop平台上HDFS和MapReduce的功能.工作原理和工作过程. HDFS (1)第一次启动 namenode 格式化后,创建 fsimage 和 edits 文件.如果不 ...

  5. 第06组 Beta冲刺(3/4)

    队名:福大帮 组长博客链接: 作业博客 : https://edu.cnblogs.com/campus/fzu/SoftwareEngineeringClassAofFuzhouUniversity ...

  6. 2019_软工实践_Beta(3/5)

    队名:955 组长博客:点这里! 作业博客:点这里! 组员情况 组员1(组长):庄锡荣 过去两天完成了哪些任务 文字/口头描述 ? 维持进度,检查需求 展示GitHub当日代码/文档签入记录 接下来的 ...

  7. 【软工实践】Beta冲刺(4/5)

    链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 新增数据分析展示等功能API 服务器后端部署,API接口的beta版实现 展示 ...

  8. NLP自然语言处理

    转:https://blog.csdn.net/qq_17677907/article/details/86448214 1.有哪些文本表示模型,它们各有什么优缺点?   文本表示模型是研究如何表示文 ...

  9. golang 内存监控

    golang 内存监控 - 简书 https://www.jianshu.com/p/38dc129b6870

  10. window 10 打开某个 窗口常用命令

    1. ctrl +R ,输入:inetcpl.cpl 2. ctrl +R ,输入:services.msc 3. ctrl +R ,输入:msconfig 安装双系统,设置开机引导 4. ctrl ...