项目需求:在顶层网络请求的地方捕获到项目中的每个网络请求的异常【生产】后需要将请求错误的日志报告给服务器【消费】。
思路:需要线程、不断的扫描网络请求是否有异常的消息-->有我就执行,没有等待--》很多的网络请求异常保存到一个FIFO的队列里面--》外面开个线程,要是有就将捕获到的异常冲队列中取出来--》发送错误日志到服务器。
根据这样的数据结构找到了JDK中的java.util.concurrent包下面的ConcurrentListQueue类.
这个包的作用,java.util.concurrent:包含许多线程安全、测试良好、高性能的并发构建块。不客气地说,创建 java.util.concurrent 的目的就是要实现 Collection 框架对数据结构所执行的并发操作。通过提供一组可靠的、高性能并发构建块,开发人员可以提高并发类的线程安全、可伸缩性、性能、可读性和可靠性。
补充知识:并行和并发区别
下面分析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>
<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>