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

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

      思路:需要线程、不断的扫描网络请求是否有异常的消息-->有我就执行,没有等待--》很多的网络请求异常保存到一个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中不断添加消息.

<span style="font-size:18px;">  /**
     * 生产
     */
    public static void offer(AddLogToService ats) {
        queue.offer(ats);
    }</span>

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

<span style="font-size:18px;">/**
     * 消费
     * @author wfc
     */
    class Poll implements Runnable {
        public void run() {
            // while (queue.size()>0) {
            while (true) {
                AddLogToService als = queue.poll();
                if (als == null) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    postException(Constant.URL_ADD_SERVICELOG, als);
                }
            }
        }
    }</span>


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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值