1. 前面介绍过springtaskExecutor,今天介绍一个jdk里处理多线程的方法
  2. 一、spring的配置文件(注入bean
  3. <bean id="cmsClickButtonMng" class="com.xxx.manager.main.impl.CmsClickButtonMngImpl"/>
  4. 二、线程类CustomerButton.java
  5. import java.util.concurrent.BlockingQueue;
  6. import nl.bitwalker.useragentutils.UserAgent;
  7. import org.apache.commons.lang.StringUtils;
  8. import org.springframework.web.context.ContextLoader;
  9. import org.springframework.web.context.WebApplicationContext;
  10. import com.xxxx.cms.entity.main.CmsClickButton;
  11. import com.xxxx.cms.manager.main.CmsClickButtonMng;
  12. import com.xxxx.common.util.UserAgentUtils;
  13. @SuppressWarnings("rawtypes")
  14. public class ConsumerButton implements Runnable{
  15. public static boolean running = false;
  16. protected WebApplicationContext ctx;
  17. private CmsClickButtonMng cmsClickButtonMng;//要处理的类
  18. protected BlockingQueue queue = null;
  19. protected static int i = 0;
  20.  
  21. public ConsumerButton(BlockingQueue queue) {
  22. this.queue = queue;
  23. }
  24.  
  25. public void run() {
  26. try {
  27. System.out.println("queue大小为:"+ queue.size());
  28. while(!queue.isEmpty()){
  29. CmsClickButton cb = (CmsClickButton) queue.take();
  30. if(cb != null){
  31. record(cb);
  32. }
  33. }
  34. ConsumerButton.running = false;
  35. } catch (InterruptedException e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. /**业务*/
  40. public void record(CmsClickButton cb){
  41. try {
  42. if(cb != null){
  43. if(StringUtils.isNotBlank(cb.getAgent())){
  44. String agent = cb.getAgent();
  45. String customerModel = UserAgentUtils.getCustomerModel(agent);//手机型号
  46. cb.setCustomerModel(customerModel);
  47. UserAgent userAgent = UserAgent.parseUserAgentString(agent);
  48. if(userAgent != null){
  49. String browserName = String.valueOf(userAgent.getBrowser().getName());//浏览器类型
  50. String operatingSystem = String.valueOf(userAgent.getOperatingSystem().getName());//操作系统类型
  51. String browserVersion =String.valueOf(userAgent.getBrowserVersion());//浏览器版本
  52. boolean isMobileDevice = userAgent.getOperatingSystem().isMobileDevice();//是否是移动设备
  53. cb.setBrowserName(browserName);
  54. cb.setBrowserVersion(browserVersion);
  55. cb.setIsMobileDevice(isMobileDevice);
  56. cb.setOperatingSystem(operatingSystem);
  57. }
  58. }
  59. WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
  60. cmsClickButtonMng = (CmsClickButtonMng) wac.getBean("cmsClickButtonMng");
  61. cmsClickButtonMng.saveCb(cb);
  62. ConsumerButton.i++;
  63. System.out.println("finish ..."+ConsumerButton.i);
  64. }
  65. } catch (Exception e) {
  66. e.printStackTrace();
  67. }
  68. }
  69. }
  70. 三、Producer.java
  71. import java.util.concurrent.BlockingQueue;
  72. import com.gmiao.cms.entity.main.CmsClickButton;
  73. import com.gmiao.cms.entity.main.CmsTrafficPage;
  74. @SuppressWarnings("rawtypes")
  75. public class Producer implements Runnable {
  76. protected BlockingQueue queue = null;
  77. protected CmsTrafficPage tp = null; //产品一
  78. protected CmsClickButton cb = null; //产品二
  79. public Producer(BlockingQueue queue,CmsTrafficPage tp) {
  80. this.queue = queue;
  81. this.tp = tp;
  82. }
  83. public Producer(BlockingQueue queue,CmsClickButton cb) {
  84. this.queue = queue;
  85. this.cb = cb;
  86. }
  87. @SuppressWarnings("unchecked")
  88. public void run() {
  89. try {
  90. if(tp != null){
  91. queue.put(tp);
  92. }else if(cb != null){
  93. queue.put(cb);
  94. }
  95. } catch (InterruptedException e) {
  96. e.printStackTrace();
  97. }
  98. }
  99. }
  100. 四、springmvc
  101. /**
  102. * 参数指队列的最大容量
  103. */
  104. public static BlockingQueue queue = new ArrayBlockingQueue(10000);
  105. @RequestMapping(value="/save.jspf")
  106. public void save(String pid,String openId,String pageName,HttpServletRequest request,HttpServletResponse response){
  107. try {
  108. //如果项目id或 页面名称为空,则不作记录
  109. if(StringUtils.isBlank(pid) || StringUtils.isBlank(pageName)){
  110. ajaxErrorToJson(response, null, "项目id或页面名称不能为空!");
  111. return ;
  112. }
  113. CmsTrafficPage tp = new CmsTrafficPage();
  114. tp.setPid(pid);
  115. tp.setDate(new Date());
  116. tp.setStayTime(0l);
  117. tp.setIp(RequestUtils.getIpAddr(request));//用户ip地址
  118. tp.setPageName(pageName);
  119. tp.setPageUrl(request.getHeader("Referer"));//发起请求的页面链接
  120. tp.setSessionId(request.getSession().getId());//用户sessionId
  121. String agent = request.getHeader("user-agent");//客户端信息
  122. if(StringUtils.isNotBlank(agent)){
  123. tp.setAgent(agent);
  124. }
  125. BlockingQueue queue = TrafficPageAct.queue;//所在的action或controller
  126. Producer producer = new Producer(queue,tp);
  127. new Thread(producer).start();
  128. if(!Consumer.running){
  129. Consumer consumer = new Consumer(queue);
  130. new Thread(consumer).start();
  131. Consumer.running = true;
  132. }
  133. } catch (Exception e) {
  134. log.error("记录页面的访问出错了!",e);
  135. ajaxErrorToJson(response, null, "记录页面访问出错了!");
  136. return ;
  137. }
  138. }
  139. 我这里只是项目代码中使用BlockQueue,要了解或学习可以查看下面一位网页的文章http://wsmajunfeng.iteye.com/blog/1629354或查看jdk文档

  1.  

  

160801、BlockingQueue处理多线程的更多相关文章

  1. 阅读ArrayBlockingQueue源码了解如何利用锁实现BlockingQueue

    BlockingQueue是多线程里面一个非常重要的数据结构.在面试的时候,也常会被问到怎么实现BlockingQueue.本篇根据Java7里ArrayBlockingQueue的源码,简单介绍一下 ...

  2. Java Nio 笔记

    网上的很多关于NIO的资料是不正确的,nio 支持阻塞和非阻塞模式 关于读写状态切换 在读写状态切换的情况下是不能使用regedit 方法注册,而应该使用以下方式进行 selectionKey.int ...

  3. Mudo C++网络库第三章学习笔记

    多线程服务器的适用场合与常用编程模型 进程间通信与线程同步; 以最简单规范的方式开发功能正确.线程安全的多线程程序; 多线程服务器是指运行在linux操作系统上的独占式网络应用程序; 不考虑分布式存储 ...

  4. 多线程编程-工具篇-BlockingQueue

    在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全"传输"数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序 ...

  5. Java多线程15:Queue、BlockingQueue以及利用BlockingQueue实现生产者/消费者模型

    Queue是什么 队列,是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的.无论使用哪种排序方式,队列的头都是调用remove()或poll()移 ...

  6. JAVA多线程之间共享数据BlockingQueue介绍

    在JAVA的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利. ...

  7. Java多线程-工具篇-BlockingQueue

    前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列 类,为我们快速搭建高质量的多线程程序带来极大的 ...

  8. Java多线程-工具篇-BlockingQueue(转)

    前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列 类,为我们快速搭建高质量的多线程程序带来极大的 ...

  9. 多线程学习之BlockingQueue

    前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列 类,为我们快速搭建高质量的多线程程序带来极大的 ...

随机推荐

  1. android:imeOptions属性

    imeOptions软键盘setOnEditorActionListener  默认情况下软键盘右下角的按钮为“下一个”,点击会到下一个输入框,保持软键盘 设置 android:imeOptions= ...

  2. Mac OS 下安装mysql环境

    传送门:Mac下安装与配置MySQL   mac 上怎么重置mysql的root的密码? 一.下载mysql 进入官方下载地址:https://www.mysql.com/downloads/ 1.找 ...

  3. 消息队列 概念 配合SpringBoot使用Demo

    转http://www.jianshu.com/p/048e954dab40 概念: 分布式消息队列 ‘分布式消息队列’包含两个概念 一是‘消息队列’,二是‘分布式’ 那么就先看下消息队列的概念,和为 ...

  4. Sql學習資源

    http://blog.csdn.net/wltica/article/category/1324738/1 SQL Server 整体方案系列: 1. SQL Server 数据归档方案 2. SQ ...

  5. zookeeper(一):功能和原理

    简介 ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现.分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅.负载均衡.命名服务.分 ...

  6. Hadoop-2.4.0分布式安装手冊

    文件夹 文件夹 1 1. 前言 2 2. 部署 2 2.1. 机器列表 2 2.2. 主机名 2 2.2.1. 暂时改动主机名 3 2.2.2. 永久改动主机名 3 2.3. 免password登录范 ...

  7. mybatis-config.xml文件详解

    1. 属性列表 Mybatis的配置文件中包含了影响mybatis行为的设置(settings)和属性(properties)信息.文档的顶层结构如下: ·configuration 根配置 ·pro ...

  8. AAtitit.随时间变色特效 ---包厢管理系统的规划titit.随

    Atitit.随时间变色特效 ---包厢管理系统的规划 1 流程滴定仪 定义的参数 颜色.位置(开始值,结束值,当前比值) >>返回数值 可以后期处理转成双位16进制码 分别定义复合颜色的 ...

  9. Android Studio怎样查看branch列表及切换branch

    针对Android Studio的系列文章,都是一个小问题为一篇,并没有整理到一起,主要是方便大家依据自己的须要来查找,同一时候为了便于大家理解,都会直接上图. 我这里使用的版本号控制工具是git,由 ...

  10. matplotlib极坐标系应用之雷达图

    #!/usr/bin/env python3 #-*- coding:utf-8 -*- ############################ #File Name: test.py #Autho ...