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很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列 类,为我们快速搭建高质量的多线程程序带来极大的 ...
随机推荐
- PHP保留2位小数、格式化小数、浮点数
JS保留两位小数例子 四舍五入使用函数 toFixed() [javascript] <html> <head> </head> <script> va ...
- GSM/GPRS/EDGE简介
GSM 全球移动通信系统(Global System of Mobile communication),是全球应用最广泛的移动电话标准.GSM被认为是第二代移动通信标准(2G),同时它是一个开放的标准 ...
- ss - float浮动模块的高度问题 解决方案
当一个Div中的子元素都是浮动元素时,该div是没有高度的.通常会带来很多困扰,解决方案如下: 低版本统配兼容: overflow: hidden; 下面是不支持低配浏览器,而且似乎该效果对 P 标签 ...
- Mac 學習系列之Python Challenge 11-20
11.给你一个正整数列表 L, 如 L=[2,8,3,50], 输出L内全部数字的乘积末尾0的个数, 如例子L的结果为2.(提示:不要直接相乘,数字非常多,可能溢出) Answer: n_2 = 0 ...
- 第四篇: python函数续
1.函数的嵌套 函数的嵌套调用:在调用一个函数的过程中,又调用了其它函数 示例1: def bar(): print('from nbar') def foo(): print('from foo') ...
- 关于mysql内存表的一个帖子(转载)
地址:http://bbs.csdn.net/topics/360030699 引用楼主 zgycsmb 的回复:问:1mysql的内存表性能怎么样2mysql的内存表与system v 这种共享内存 ...
- lua工具库penlight--06数据(二)
词法扫描 虽然 Lua 的字符串模式匹配是非常强大,但需要更强大的东西.pl.lexer.scan可以提供标记字符串,按标记机分类数字.字符串等. > lua -lpl Lua 5.1.4 C ...
- U盘工作原理(转)
u盘工作原理 一. U盘基本工作原理 通用串行总线(Universal serial Bus)是一种快速灵活的接口, 当一个USB设备插入主机时,由于USB设备硬件本身的原因,它会使USB总线的数据信 ...
- Acme Corporation UVA - 11613 拆点法+最大费用最大流(费用取相反数)+费用有正负
/** 题目:Acme Corporation UVA - 11613 拆点法+最大费用最大流(费用取相反数)+费用有正负 链接:https://vjudge.net/problem/UVA-1161 ...
- zabbix 源码安装
操作系统:CentOS IP地址:192.168.21.127 Web环境:Nginx+MySQL+PHP zabbix版本:Zabbix 2.2 LTS 备注:Linux下安装zabbix需要有LA ...