转载请标明出处: http://xuantan.iteye.com/blog/1867971
- 编写代码的过程中,我们常常会抽象出来一些工具类及工具方法(静态类、静态方法)。
- 下面请看一段代码:
public class BaiduMessagePushAPI { public static void messagePush(String baiduUserId,MessagePOJO messagePOJO,String msgKeys,String baiduChannelId,Integer messageType) { //序列化 String messages = JSON.toJSONString(messagePOJO); messages = jsonencode(messages); long timestamp = System.currentTimeMillis()/1000; Map<String,Object> params = new HashMap<String, Object>(); params.put("method", METHOD); params.put("apikey", API_KEY); ... ResultObject resultObject; try { resultObject = HttpClientUtils.sendPost(URL, params); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } }
- 以上便是一个很常见的工具方法,我们无需关心其具体内容,总之大概意思就是发起一个Post请求,而且不关注这次请求的结果究竟是什么。
- 遇到以上这种业务场景,我认为采用开辟一个新线程来处理这段业务更为合适。当提到线程,我们不约而同的又会联想到线程池。
- 下面这段代码就是基于以上的需求和代码重构而成,其中包括了几个技术点:1、单例模式 2、多线程 3、线程池
public class BaiduMessagePushAPI { private volatile static BaiduMessagePushAPI singleInstance; private BaiduMessagePushAPI() { } public static BaiduMessagePushAPI getInstance() { if (singleInstance == null) { synchronized (BaiduMessagePushAPI.class) { if (singleInstance == null) { singleInstance = new BaiduMessagePushAPI(); } } } return singleInstance; } ... public void messagePush(String baiduUserId,MessagePOJO messagePOJO,String msgKeys,String baiduChannelId,Integer messageType) { //线程池工具方法 ThreadPoolUtils.execute(new messagePushThread(baiduUserId, messagePOJO, msgKeys, baiduChannelId, messageType)); } private class messagePushThread implements Runnable { String baiduUserId; MessagePOJO messagePOJO; String msgKeys; String baiduChannelId; Integer messageType; public messagePushThread(String baiduUserId,MessagePOJO messagePOJO,String msgKeys,String baiduChannelId,Integer messageType){ this.baiduUserId = baiduUserId; this.messagePOJO = messagePOJO; this.msgKeys = msgKeys; this.baiduChannelId = baiduChannelId; this.messageType = messageType; } @Override public void run() { //序列化 String messages = JSON.toJSONString(messagePOJO); messages = jsonencode(messages); long timestamp = System.currentTimeMillis()/1000; Map<String,Object> params = new HashMap<String, Object>(); params.put("method", METHOD); params.put("apikey", API_KEY); .... try { resultObject = HttpClientUtils.sendPost(URL, params); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } }
根据网友的反馈,意识到自己确实犯了一些错误,因此特来修改:
其实上面的业务场景,只需要把线程类变为静态的即可,并且放在静态方法中调用,无需采用单例模式这样绕圈子的方案,修改后代码如下:
public class BaiduMessagePushAPI { public static void messagePush(String baiduUserId,MessagePOJO messagePOJO,String msgKeys,String baiduChannelId,Integer messageType) { ThreadPoolUtils.execute(new messagePushThread(baiduUserId, messagePOJO, msgKeys, baiduChannelId, messageType)); } private static class messagePushThread implements Runnable { String baiduUserId; MessagePOJO messagePOJO; String msgKeys; String baiduChannelId; Integer messageType; public messagePushThread(String baiduUserId,MessagePOJO messagePOJO,String msgKeys,String baiduChannelId,Integer messageType){ this.baiduUserId = baiduUserId; this.messagePOJO = messagePOJO; this.msgKeys = msgKeys; this.baiduChannelId = baiduChannelId; this.messageType = messageType; } @Override public void run() { //序列化 String messages = JSON.toJSONString(messagePOJO); messages = jsonencode(messages); long timestamp = System.currentTimeMillis()/1000; Map<String,Object> params = new HashMap<String, Object>(); params.put("method", METHOD); params.put("apikey", API_KEY); ...... ResultObject resultObject; try { resultObject = HttpClientUtils.sendPost(URL, params); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } }
相关推荐
Java VisualVM是一个多线程的监控分析工具,VisualVM 是一款免费的\集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优。功能包括内存分析、快照功能、转储功能...
Java多线程编程实战指南...本书以基本概念、原理与方法为主线,辅以丰富的实战案例和生活化实例,并从Java虚拟机、操作系统和硬件多个层次与角度出发,循序渐进、系统地介绍Java平台下的多线程编程核心技术及相关工具。
《Java多线程编程实战指南(核心篇)》以基本概念、原理与方法为主线,辅以丰富的实战案例和生活化实例,并从Java虚拟机、操作系统和硬件多个层次与角度出发,循序渐进、系统地介绍Java平台下的多线程编程核心技术及...
基于爬虫,动态收集扫描目标相关信息后进行二次整理形成字典规则,利用动态规则的多线程敏感信息泄露检测工具,支持多种个性化定制选项,包括: 规则字典多样化定义(支持正则、整数、字符、日期) 扫描域名策略...
多线程多连接。所有这些功能特性在同类工具中表现突出,甚至是本工具独有的! 还有,它能快速显示SQL的解释计划;能运行/调试 PL/SQL 语句;精确的错误定位;高 效的语句块操作;SQL格式美化;连接配置简单;自动...
2 多线程,程序运行后,主线程负责接收用户的操作,另外一个线程执行定时备份功能 3 程序最小化后在任务栏中显示为一颗跳动的心 4 程序关闭时保存设定的任务,下次运行程序时自动加载任务并继续执行。
A星寻路 不贴墙 多线程 插件 内有使用说明
6. 支持对窗口进行各种操作,关闭,最小化等等 内存方面 1. 支持CE格式的内存读取 2. 支持各种数据类型的搜索,以及多次搜索(类似CE) 3. 强力内存接口,按键自带的读不到,可以试试这个 4. 强力的内存写接口(简单...
设置扫描目标后,调用类中get_target()方法即可开始扫描,可在port_list.txt中自定义扫描端口,算是一个工具模块,调用方便,自定义线程类支持可调节线程数量,可根据自己需要调整,由于是相当于重构默认的threading...
基于爬虫,动态收集扫描目标相关信息后进行二次整理形成字典规则,利用动态规则的多线程敏感信息泄露检测工具,支持多种个性化定制选项,包括: 规则字典多样化定义(支持正则、整数、字符、日期) 扫描域名策略...
若有需要写UI自动化,接口自动化,多线程,服务器测试定时脚本等等,可联系本工具熊。 分五步操作实现50个或更多用户并发操作,代码可直接运行 ①打开网页,获取到后端给的cookie; ②登录用户,保持链接; ③业务...
这是我针对以前发出的两个工具做的一些优化和集成,增加了自动识别网卡mac等功能,优化了攻击时间的控制策略。如果大家只是学习用,建议下载以上的代码进行修改和自己编写。 备注:代码自己学习测试用得,有恶意攻击...
英特尔® TBB 采用增量式线程化方法,始自对初始的 72 项关键工程操作进行线程化,紧接着对用于生成边缘图物理基元的代码实施了线程化。在两路 (2S) 英特尔® 至强® 处理器 5100 系列平台(四核)上对七个较大的...
纯JavaFX实现的多线程分段下载工具,不依赖任何第三方库,实现多线程分段下载以及下载完成后的资源合并,全图形化界面操作,充分利用多核CPU。
Java SE学习完成后,自己练手项目十一 这个项目里面多出了:任务栏图标功能实现,和浮动图标的...巩固了线程、序列化等概念,再次使用树形、表格 留心主界面的关闭按钮,我改成隐藏界面,并不是前面的缺省关闭了。
多线程,断点续传等功能更加把文件下载的传统功能进一步升华。 列表文件,使得对文件的下载管理更直接,更方便。 从网页搜取下载连接,从文件获得下载链接并启动下载,这些都是方便用户使用的措施。往往几条...
- 要同时支持并行和串行:抽象出多线程模型,将串行视为多线程中只有一个线程的特例,解决多线程输出乱序问题 - 文件传输功能:由于ssh的sftp子系统只支持单个文件传输,所以需要以递归思想传输目录;尽量减少无谓...
本程序中应用了以下几种技术:1 大图标工具栏2 多线程,程序运行后,主线程负责接收用户的操作,另外一个线程执行定时备份功能3 程序最小化后在任务栏中显示为一颗跳动的心4 程序关闭时保存设定的任务,下次运行程序...
Photon——可直接下载磁力链接、基于aria2 的免费多线程下载工具Photon 是一款基于 aria2 的、免费的多线程下载软件,拥有易用、友好的图形界面,支持 磁力链,HTTP/HTTPS,BT 和 Metalink。 aria2 以其好用又难用而...
利用Pthread多线程工具 实现桶排序的并行化,并在linux下调试通过。