• 一个ConcurrentLinkedQueue实现生产者消费者模型的例子



    生产者消费者问题【线程中ConcurrentLinkedQueue】

    http://blog.csdn.net/ItJavawfc/article/details/50423595


    项目需求:在顶层网络请求的地方捕获到项目中的每个网络请求的异常【生产】后需要将请求错误的日志报告给服务器【消费】。

          思路:需要线程、不断的扫描网络请求是否有异常的消息-->有我就执行,没有等待--》很多的网络请求异常保存到一个FIFO的队列里面--》外面开个线程,要是有就将捕获到的异常冲队列中取出来--》发送错误日志到服务器。

    根据这样的数据结构找到了JDK中的java.util.concurrent包下面的ConcurrentListQueue类.

    这个包的作用,java.util.concurrent:包含许多线程安全、测试良好、高性能的并发构建块。不客气地说,创建 java.util.concurrent 的目的就是要实现 Collection 框架对数据结构所执行的并发操作。通过提供一组可靠的、高性能并发构建块,开发人员可以提高并发类的线程安全、可伸缩性、性能、可读性和可靠性。

    补充知识:并行和并发区别

    1、并行是指两者同时执行一件事,比如赛跑,两个人都在不停的往前跑;
    2、并发是指资源有限的情况下,两者交替轮流使用资源,比如一段路(单核CPU资源)同时只能过一个人,A走一段后,让给B,B用完继续给A ,交替使用,目的是提高效率 


    下面分析ConcurrentLinkedQueue:一个FIFO的无界线程安全队列。
      
      
    根据个人的项目需求,使用了:offer方法和poll方法。
    
    
    实例如下:
    声明:
    private static ConcurrentLinkedQueue<AddLogToService> queue = new ConcurrentLinkedQueue<AddLogToService>();

    生产的实现:调用queue的offer方法,向queue中不断添加消息.

    [java] view plain copy
    1. <span style="font-size:18px;">  /** 
    2.      * 生产 
    3.      */  
    4.     public static void offer(AddLogToService ats) {  
    5.         queue.offer(ats);  
    6.     }</span>  

    消费逻辑:
    开启线程,不断从队列【queue】中取【poll】消息,如果有消息就执行业务逻辑,如果没有就睡眠一秒

    [java] view plain copy
    1. <span style="font-size:18px;">/** 
    2.      * 消费 
    3.      * @author wfc 
    4.      */  
    5.     class Poll implements Runnable {  
    6.         public void run() {  
    7.             // while (queue.size()>0) {  
    8.             while (true) {  
    9.                 AddLogToService als = queue.poll();  
    10.                 if (als == null) {  
    11.                     try {  
    12.                         Thread.sleep(1000);  
    13.                     } catch (InterruptedException e) {  
    14.                         e.printStackTrace();  
    15.                     }  
    16.                 } else {  
    17.                     postException(Constant.URL_ADD_SERVICELOG, als);  
    18.                 }  
    19.             }  
    20.         }  
    21.     }</span>  


    那么怎么跑起来呢,网络请求要是有错误,直接调用offer方法,不断生产即可。

  • 相关阅读:
    PLC 控制系统资源
    .net core 控制台程序生成EXE
    EF Core 日志跟踪sql语句
    Oracle 设置自启动
    数据库批量插入数据
    字符串面试题系列之六:在字符串中删除特定的字符
    字符串面试题系列之五:删除字符串空格
    字符串面试题系列之四:字符串匹配二
    字符串面试题系列之三:左旋转字符串
    字符串面试题系列之二:连续最长数字串
  • 原文地址:https://www.cnblogs.com/silyvin/p/9106627.html
Copyright © 2020-2023  润新知