160801、BlockingQueue处理多线程

- 前面介绍过spring的taskExecutor,今天介绍一个jdk里处理多线程的方法
- 一、spring的配置文件(注入bean)
- <bean id="cmsClickButtonMng" class="com.xxx.manager.main.impl.CmsClickButtonMngImpl"/>
- 二、线程类CustomerButton.java
- import java.util.concurrent.BlockingQueue;
- import nl.bitwalker.useragentutils.UserAgent;
- import org.apache.commons.lang.StringUtils;
- import org.springframework.web.context.ContextLoader;
- import org.springframework.web.context.WebApplicationContext;
- import com.xxxx.cms.entity.main.CmsClickButton;
- import com.xxxx.cms.manager.main.CmsClickButtonMng;
- import com.xxxx.common.util.UserAgentUtils;
- @SuppressWarnings("rawtypes")
- public class ConsumerButton implements Runnable{
- public static boolean running = false;
- protected WebApplicationContext ctx;
- private CmsClickButtonMng cmsClickButtonMng;//要处理的类
- protected BlockingQueue queue = null;
- protected static int i = 0;
- public ConsumerButton(BlockingQueue queue) {
- this.queue = queue;
- }
- public void run() {
- try {
- System.out.println("queue大小为:"+ queue.size());
- while(!queue.isEmpty()){
- CmsClickButton cb = (CmsClickButton) queue.take();
- if(cb != null){
- record(cb);
- }
- }
- ConsumerButton.running = false;
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- /**业务*/
- public void record(CmsClickButton cb){
- try {
- if(cb != null){
- if(StringUtils.isNotBlank(cb.getAgent())){
- String agent = cb.getAgent();
- String customerModel = UserAgentUtils.getCustomerModel(agent);//手机型号
- cb.setCustomerModel(customerModel);
- UserAgent userAgent = UserAgent.parseUserAgentString(agent);
- if(userAgent != null){
- String browserName = String.valueOf(userAgent.getBrowser().getName());//浏览器类型
- String operatingSystem = String.valueOf(userAgent.getOperatingSystem().getName());//操作系统类型
- String browserVersion =String.valueOf(userAgent.getBrowserVersion());//浏览器版本
- boolean isMobileDevice = userAgent.getOperatingSystem().isMobileDevice();//是否是移动设备
- cb.setBrowserName(browserName);
- cb.setBrowserVersion(browserVersion);
- cb.setIsMobileDevice(isMobileDevice);
- cb.setOperatingSystem(operatingSystem);
- }
- }
- WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
- cmsClickButtonMng = (CmsClickButtonMng) wac.getBean("cmsClickButtonMng");
- cmsClickButtonMng.saveCb(cb);
- ConsumerButton.i++;
- System.out.println("finish ..."+ConsumerButton.i);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- 三、Producer.java
- import java.util.concurrent.BlockingQueue;
- import com.gmiao.cms.entity.main.CmsClickButton;
- import com.gmiao.cms.entity.main.CmsTrafficPage;
- @SuppressWarnings("rawtypes")
- public class Producer implements Runnable {
- protected BlockingQueue queue = null;
- protected CmsTrafficPage tp = null; //产品一
- protected CmsClickButton cb = null; //产品二
- public Producer(BlockingQueue queue,CmsTrafficPage tp) {
- this.queue = queue;
- this.tp = tp;
- }
- public Producer(BlockingQueue queue,CmsClickButton cb) {
- this.queue = queue;
- this.cb = cb;
- }
- @SuppressWarnings("unchecked")
- public void run() {
- try {
- if(tp != null){
- queue.put(tp);
- }else if(cb != null){
- queue.put(cb);
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- 四、springmvc
- /**
- * 参数指队列的最大容量
- */
- public static BlockingQueue queue = new ArrayBlockingQueue(10000);
- @RequestMapping(value="/save.jspf")
- public void save(String pid,String openId,String pageName,HttpServletRequest request,HttpServletResponse response){
- try {
- //如果项目id或 页面名称为空,则不作记录
- if(StringUtils.isBlank(pid) || StringUtils.isBlank(pageName)){
- ajaxErrorToJson(response, null, "项目id或页面名称不能为空!");
- return ;
- }
- CmsTrafficPage tp = new CmsTrafficPage();
- tp.setPid(pid);
- tp.setDate(new Date());
- tp.setStayTime(0l);
- tp.setIp(RequestUtils.getIpAddr(request));//用户ip地址
- tp.setPageName(pageName);
- tp.setPageUrl(request.getHeader("Referer"));//发起请求的页面链接
- tp.setSessionId(request.getSession().getId());//用户sessionId
- String agent = request.getHeader("user-agent");//客户端信息
- if(StringUtils.isNotBlank(agent)){
- tp.setAgent(agent);
- }
- BlockingQueue queue = TrafficPageAct.queue;//所在的action或controller
- Producer producer = new Producer(queue,tp);
- new Thread(producer).start();
- if(!Consumer.running){
- Consumer consumer = new Consumer(queue);
- new Thread(consumer).start();
- Consumer.running = true;
- }
- } catch (Exception e) {
- log.error("记录页面的访问出错了!",e);
- ajaxErrorToJson(response, null, "记录页面访问出错了!");
- return ;
- }
- }
- 我这里只是项目代码中使用BlockQueue,要了解或学习可以查看下面一位网页的文章http://wsmajunfeng.iteye.com/blog/1629354或查看jdk文档
160801、BlockingQueue处理多线程的更多相关文章
- 阅读ArrayBlockingQueue源码了解如何利用锁实现BlockingQueue
BlockingQueue是多线程里面一个非常重要的数据结构.在面试的时候,也常会被问到怎么实现BlockingQueue.本篇根据Java7里ArrayBlockingQueue的源码,简单介绍一下 ...
- Java Nio 笔记
网上的很多关于NIO的资料是不正确的,nio 支持阻塞和非阻塞模式 关于读写状态切换 在读写状态切换的情况下是不能使用regedit 方法注册,而应该使用以下方式进行 selectionKey.int ...
- Mudo C++网络库第三章学习笔记
多线程服务器的适用场合与常用编程模型 进程间通信与线程同步; 以最简单规范的方式开发功能正确.线程安全的多线程程序; 多线程服务器是指运行在linux操作系统上的独占式网络应用程序; 不考虑分布式存储 ...
- 多线程编程-工具篇-BlockingQueue
在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全"传输"数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序 ...
- Java多线程15:Queue、BlockingQueue以及利用BlockingQueue实现生产者/消费者模型
Queue是什么 队列,是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的.无论使用哪种排序方式,队列的头都是调用remove()或poll()移 ...
- JAVA多线程之间共享数据BlockingQueue介绍
在JAVA的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利. ...
- Java多线程-工具篇-BlockingQueue
前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列 类,为我们快速搭建高质量的多线程程序带来极大的 ...
- Java多线程-工具篇-BlockingQueue(转)
前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列 类,为我们快速搭建高质量的多线程程序带来极大的 ...
- 多线程学习之BlockingQueue
前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列 类,为我们快速搭建高质量的多线程程序带来极大的 ...
随机推荐
- android:imeOptions属性
imeOptions软键盘setOnEditorActionListener 默认情况下软键盘右下角的按钮为“下一个”,点击会到下一个输入框,保持软键盘 设置 android:imeOptions= ...
- Mac OS 下安装mysql环境
传送门:Mac下安装与配置MySQL mac 上怎么重置mysql的root的密码? 一.下载mysql 进入官方下载地址:https://www.mysql.com/downloads/ 1.找 ...
- 消息队列 概念 配合SpringBoot使用Demo
转http://www.jianshu.com/p/048e954dab40 概念: 分布式消息队列 ‘分布式消息队列’包含两个概念 一是‘消息队列’,二是‘分布式’ 那么就先看下消息队列的概念,和为 ...
- Sql學習資源
http://blog.csdn.net/wltica/article/category/1324738/1 SQL Server 整体方案系列: 1. SQL Server 数据归档方案 2. SQ ...
- zookeeper(一):功能和原理
简介 ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现.分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅.负载均衡.命名服务.分 ...
- 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登录范 ...
- mybatis-config.xml文件详解
1. 属性列表 Mybatis的配置文件中包含了影响mybatis行为的设置(settings)和属性(properties)信息.文档的顶层结构如下: ·configuration 根配置 ·pro ...
- AAtitit.随时间变色特效 ---包厢管理系统的规划titit.随
Atitit.随时间变色特效 ---包厢管理系统的规划 1 流程滴定仪 定义的参数 颜色.位置(开始值,结束值,当前比值) >>返回数值 可以后期处理转成双位16进制码 分别定义复合颜色的 ...
- Android Studio怎样查看branch列表及切换branch
针对Android Studio的系列文章,都是一个小问题为一篇,并没有整理到一起,主要是方便大家依据自己的须要来查找,同一时候为了便于大家理解,都会直接上图. 我这里使用的版本号控制工具是git,由 ...
- matplotlib极坐标系应用之雷达图
#!/usr/bin/env python3 #-*- coding:utf-8 -*- ############################ #File Name: test.py #Autho ...