`
zhangym124
  • 浏览: 339437 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

工具方法的多线程化

阅读更多

转载请标明出处: 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();
			}
		}
	}
}

 

 

 

转载请标明出处: http://xuantan.iteye.com/blog/1867971

1
3
分享到:
评论
5 楼 享受生活 2013-05-15  
1.工具类一般是没有自己的实例变量,也不需要
2.而且方法大多都是静态方法,即与类相关,与实例无关

而多线程的概念关键在于数据的共享与同步,而基于任何以上一点就已经与多线程毫无关联了,工具类没有自己的数据,又何来共享与同步,更不需要多线程了。
4 楼 20130115 2013-05-14  
不好意思,没看见volatile
3 楼 20130115 2013-05-14  
这种错误的延迟加载单例也能上首页,误人子弟
2 楼 smallbee 2013-05-14  
编写代码的过程中,我们常常会抽象出来一些工具类及工具方法(静态类、静态方法)。但是静态类中的静态方法我们无法将其多线程化。


静态类的静态方法为啥不能多线程?
多线程的单例可能有现场安全问题,使用加锁的静态方法就可以啊,锁住静态类的所有静态方法。
1 楼 wesleyporter 2013-05-13  
感觉楼主你这种做法一点意义都没有,为什么不直接把messagePush设为static方法就行了,为什么要搞这么复杂的事情?

相关推荐

    JavaVisualVM可视化多线程监控分析工具v1.3.8官方安装版

    Java VisualVM是一个多线程的监控分析工具,VisualVM 是一款免费的\集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优。功能包括内存分析、快照功能、转储功能...

    Java多线程编程实战指南(核心篇)

    Java多线程编程实战指南...本书以基本概念、原理与方法为主线,辅以丰富的实战案例和生活化实例,并从Java虚拟机、操作系统和硬件多个层次与角度出发,循序渐进、系统地介绍Java平台下的多线程编程核心技术及相关工具。

    java多线程编程实战指南 核心篇 代码

    《Java多线程编程实战指南(核心篇)》以基本概念、原理与方法为主线,辅以丰富的实战案例和生活化实例,并从Java虚拟机、操作系统和硬件多个层次与角度出发,循序渐进、系统地介绍Java平台下的多线程编程核心技术及...

    人工智能-项目实践-多线程-动态多线程敏感信息泄露检测工具.zip

    基于爬虫,动态收集扫描目标相关信息后进行二次整理形成字典规则,利用动态规则的多线程敏感信息泄露检测工具,支持多种个性化定制选项,包括: 规则字典多样化定义(支持正则、整数、字符、日期) 扫描域名策略...

    Oracle工具 - Oracle SQL Handler - 好用又实用,多线程,能运行于 Windows 及 Linux ,免装Oracle客户端

    多线程多连接。所有这些功能特性在同类工具中表现突出,甚至是本工具独有的! 还有,它能快速显示SQL的解释计划;能运行/调试 PL/SQL 语句;精确的错误定位;高 效的语句块操作;SQL格式美化;连接配置简单;自动...

    具有多线程的数据库备份程序forSQLServer

    2 多线程,程序运行后,主线程负责接收用户的操作,另外一个线程执行定时备份功能 3 程序最小化后在任务栏中显示为一颗跳动的心 4 程序关闭时保存设定的任务,下次运行程序时自动加载任务并继续执行。

    A星寻路 不贴墙 多线程 插件

    A星寻路 不贴墙 多线程 插件 内有使用说明

    大漠中文模块 多线程 带例子

    6. 支持对窗口进行各种操作,关闭,最小化等等 内存方面 1. 支持CE格式的内存读取 2. 支持各种数据类型的搜索,以及多次搜索(类似CE) 3. 强力内存接口,按键自带的读不到,可以试试这个 4. 强力的内存写接口(简单...

    python端口扫描工具-多线程极速扫描-自定义扫描端口/全端口

    设置扫描目标后,调用类中get_target()方法即可开始扫描,可在port_list.txt中自定义扫描端口,算是一个工具模块,调用方便,自定义线程类支持可调节线程数量,可根据自己需要调整,由于是相当于重构默认的threading...

    人工智能-项目实践-检测-动态多线程敏感信息泄露检测工具.zip

    基于爬虫,动态收集扫描目标相关信息后进行二次整理形成字典规则,利用动态规则的多线程敏感信息泄露检测工具,支持多种个性化定制选项,包括: 规则字典多样化定义(支持正则、整数、字符、日期) 扫描域名策略...

    python多线程接口案例

    若有需要写UI自动化,接口自动化,多线程,服务器测试定时脚本等等,可联系本工具熊。 分五步操作实现50个或更多用户并发操作,代码可直接运行 ①打开网页,获取到后端给的cookie; ②登录用户,保持链接; ③业务...

    多线程自动化syn&udp flood攻击集成工具

    这是我针对以前发出的两个工具做的一些优化和集成,增加了自动识别网卡mac等功能,优化了攻击时间的控制策略。如果大家只是学习用,建议下载以上的代码进行修改和自己编写。 备注:代码自己学习测试用得,有恶意攻击...

    利用英特尔 线程构建模块

    英特尔® TBB 采用增量式线程化方法,始自对初始的 72 项关键工程操作进行线程化,紧接着对用于生成边缘图物理基元的代码实施了线程化。在两路 (2S) 英特尔® 至强® 处理器 5100 系列平台(四核)上对七个较大的...

    纯JavaFX实现的多线程分段下载工具源码

    纯JavaFX实现的多线程分段下载工具,不依赖任何第三方库,实现多线程分段下载以及下载完成后的资源合并,全图形化界面操作,充分利用多核CPU。

    多线程下载工具(练手项目十一)

    Java SE学习完成后,自己练手项目十一 这个项目里面多出了:任务栏图标功能实现,和浮动图标的...巩固了线程、序列化等概念,再次使用树形、表格 留心主界面的关闭按钮,我改成隐藏界面,并不是前面的缺省关闭了。

    hdld快速多线程批量下载机器人

    多线程,断点续传等功能更加把文件下载的传统功能进一步升华。 列表文件,使得对文件的下载管理更直接,更方便。 从网页搜取下载连接,从文件获得下载链接并启动下载,这些都是方便用户使用的措施。往往几条...

    Python实现跨平台批量运维小工具 基于多线程可实现多主机并行;基于docopt提供详细的命令行界面+源代码+文档说明

    - 要同时支持并行和串行:抽象出多线程模型,将串行视为多线程中只有一个线程的特例,解决多线程输出乱序问题 - 文件传输功能:由于ssh的sftp子系统只支持单个文件传输,所以需要以递归思想传输目录;尽量减少无谓...

    具有多线程的数据库备份程序 for SQL Server

    本程序中应用了以下几种技术:1 大图标工具栏2 多线程,程序运行后,主线程负责接收用户的操作,另外一个线程执行定时备份功能3 程序最小化后在任务栏中显示为一颗跳动的心4 程序关闭时保存设定的任务,下次运行程序...

    Photon直接下载磁力链接、基于aria2 的免费多线程下载工具

    Photon——可直接下载磁力链接、基于aria2 的免费多线程下载工具Photon 是一款基于 aria2 的、免费的多线程下载软件,拥有易用、友好的图形界面,支持 磁力链,HTTP/HTTPS,BT 和 Metalink。 aria2 以其好用又难用而...

    Pthread多线程并行实现桶排序

    利用Pthread多线程工具 实现桶排序的并行化,并在linux下调试通过。

Global site tag (gtag.js) - Google Analytics