`
zhangym124
  • 浏览: 345254 次
  • 性别: 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方法就行了,为什么要搞这么复杂的事情?

相关推荐

    多线程处理工具(高效、万能的复用)

    "多线程处理工具(高效、万能的复用)"这个工具就是针对这样的需求而设计的,它具有高度的复用性和高效性。 首先,我们来理解一下多线程的基本概念。在单线程环境下,程序按照顺序执行,而多线程则允许多个任务并行...

    初始化多线程的几种方法

    以下介绍四种常见的初始化多线程的方法: 1. **使用Thread类构造函数**: 我们可以创建一个`Thread`对象,并传递一个委托(代表线程要执行的方法)给构造函数。例如: ```csharp Thread thread = new Thread(new...

    可并行递归算法的递归多线程实现

    未来的研究方向可能包括进一步优化线程调度策略,减少线程间的通信开销,以及探索更多适合多线程化的递归算法。通过持续的技术创新和优化,我们有理由相信,多线程递归算法将在未来的高性能计算领域发挥更加关键的...

    多线程_按键精灵经典多线程操作_

    理解多线程的基本原理和实践方法,有助于开发者在各种场景下实现更高效的自动化解决方案。 在压缩包文件“多线程.Q”中,很可能包含了一个或多个人工编写的具体多线程按键精灵脚本示例,可能包括线程的创建、线程间...

    Pker多线程后台极速扫描工具.zip

    《Pker多线程后台极速扫描工具:提升网络安全检测效率》 在信息技术高速发展的今天,网络安全成为了企业乃至个人用户关注的焦点。面对日益复杂的网络环境,有效的安全扫描工具显得尤为重要。Pker多线程后台极速扫描...

    用多线程实现压缩工具

    标题中的“用多线程实现压缩工具”表明我们要讨论的是如何利用多线程技术来提高压缩和解压缩操作的效率。在计算机编程中,多线程是一种并发执行任务的方法,可以充分利用多核处理器的计算能力,提高程序的响应速度和...

    ui自动化多线程+聚合报告

    在UI自动化测试中,多线程(Multithreading)和聚合报告(Aggregated Reports)是两个重要的概念,它们能够显著提升测试效率并提供更全面的测试结果反馈。 UI自动化测试通常指的是利用自动化工具如Selenium ...

    多线程FTP批量上传工具

    【标题】:“多线程FTP批量上传工具” 在IT领域,FTP(File Transfer Protocol)是一种标准网络协议,用于在客户端和服务器之间传输文件。而“多线程FTP批量上传工具”则是专门针对这一需求设计的应用软件,它允许...

    多线程后台扫描工具

    在IT领域,多线程后台扫描工具是一种常用于网络安全与系统审计的重要软件。它通过同时执行多个任务,即多线程技术,来提高扫描效率,快速遍历目标系统的潜在漏洞和弱点。这样的工具通常用于安全研究人员、渗透测试者...

    基于java开发的多线程下载工具(源码)

    《基于Java开发的多线程下载工具》 在IT领域,高效的文件下载是不可或缺的一环,尤其是对于大文件,多线程下载技术可以显著提升下载速度。本项目是一款基于Java语言开发的多线程下载工具,它实现了HTTP和FTP协议的...

    多线程网站扫描工具

    【多线程网站扫描工具】是一种高效且功能强大的软件,主要应用于网络安全领域,尤其是网站渗透测试和安全审计。这类工具通常能自动、快速地探测出网站存在的漏洞和安全隐患,为网站管理员提供重要的安全评估和防护...

    C# 多线程下载工具(源码)

    本篇将详细探讨如何利用C#中的`BackgroundWorker`和`Thread`类实现多线程下载工具。 一、`BackgroundWorker`组件 `BackgroundWorker`是.NET框架提供的一种异步执行长时间运行任务的机制。它在后台线程上执行工作,...

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

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

    多线程网站后台扫描工具

    标题中的“多线程网站后台扫描工具”是一个用于网络安全检测的软件工具,它利用多线程技术来提高扫描效率,帮助用户快速查找并评估网络应用的后台管理接口。多线程是程序设计中的一个重要概念,特别是在处理大量并发...

    C#多线程执行

    在编程领域,多线程是实现并发执行任务的关键技术,特别是在C#这样的现代编程语言中。C#提供了丰富的多线程支持,使得开发者能够高效地利用多核处理器资源,提高程序的运行效率。本篇文章将深入探讨C#中的多线程执行...

    多线程处理数据(工具)样例

    这个名为“多线程处理数据(工具)样例”的项目,显然旨在利用多线程的优势来加速数据流的处理。下面将详细探讨相关知识点。 多线程是操作系统提供的一种机制,允许一个程序同时执行多个任务或子任务。在单核处理器...

    多线程多任务的下载工具

    【标题】:“多线程多任务的下载工具” 在IT领域,多线程多任务的下载工具是一种高效利用系统资源,提升下载速度的实用程序。这类工具通常采用并发执行的策略,将大文件分割成多个小部分,然后通过多个线程同时下载...

    python selenium chrome 多开 多线程

    本主题聚焦于如何使用Python的Selenium与Chrome浏览器进行多开和多线程操作,结合phantomjs和chromedriver这两个关键组件来实现。首先,让我们详细了解一下这些概念。 1. **Selenium**: Selenium是一个强大的Web...

    Linux系统下的多线程编程入门.pdf

    本文将深入探讨Linux环境中的多线程概念、创建与管理线程的方法、线程同步与通信机制,以及多线程编程中可能遇到的问题和解决策略。 一、多线程概念 多线程是指在一个进程中可以同时执行多个独立的代码段,每个代码...

Global site tag (gtag.js) - Google Analytics