`
kongshanxuelin
  • 浏览: 931214 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

行业软件中的多线程编程探讨

阅读更多

 

试想一下以下经常碰到的业务环境的解决方案,比如未联网的*****系统:

 

  1. 数据集中部署在地级市(如宁波,杭州,温州等),各个地级市数据并不联网
业务目标:查询全国内范围的满足查询条件的数据记录

解决方案:利用地级市提供的查询接口(可能是Web Service为主)开始多线程查询,并异步展现查询结果

开发步骤:
  • 如果使用异步Web Service,可以利用Axis2,核心代码如下:
QName qname = new QName(namespace, operateName);
		RPCServiceClient client = new RPCServiceClient();
		Options options = new Options();
		options.setTo(new EndpointReference(srvcUrl));
		options.setAction("urn:" + operateName);
		client.setOptions(options);
		client.invokeNonBlocking(qname, param, new AxisCallback() {
				public void onMessage(MessageContext mc)              {
						//回调处理代码
					}
					public void onFault(MessageContext messageContext) {
					}
					public void onError(Exception e) {
						e.printStackTrace();
					}
					public void onComplete() {
					}
		});
  • 如何利用线程池管理多线程,核心代码如下:
public List invokeAll(List<TraversalProvince> tasks, long timeout) {
        List nodes = new ArrayList(tasks.size());
        try {
            List<Future<CityResult>> futures = null;
            if (timeout < 0) {
                futures = executorService.invokeAll(tasks);
            } else {
                futures = executorService.invokeAll(tasks, timeout, TimeUnit.MILLISECONDS);
            }
            for (Future future : futures) {
                try {
                    nodes.add(future.get());
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return nodes;
    }
 
  • 对结果产生的回调处理:
String taskno = StrCharUtil.formatNullStr(request.getParameter("taskno"));
String callback = StrCharUtil.formatNullStr(request.getParameter("callback"));
for(int i=0;i<10;i++){
	Thread.sleep(1000);//10秒内未获取到数据表示失败
	String res = StrCharUtil.formatNullStr(cacheTask.get(taskno));
	if(!res.equals("")){
		if(callback.equals("")){
			out.println(res);
		}else{
			out.println(callback+"("+res+")");
		}
		return;
	}
}
out.println("超时(timeout)");
 

 

以下是Log4J跟踪的运行效果:

 

2010 五月 07 14:08:18 INFO  cn.aw.task.REHunt - [14:08:18]接收到新请求:reqid=030c95364050453987c6b9a597e80295id=1,type=null,mode=0,prov=zhejiang,city=ningbo,city=hangzhou,city=shaoxing,city=jinhua,city=zhoushan,prov=shanghai,city=putuo
2010 五月 07 14:08:18 INFO  cn.aw.task.TraversalProvince - ================================线程: ningbo  开始处理...
2010 五月 07 14:08:18 INFO  cn.aw.task.TraversalProvince - ================================线程: hangzhou  开始处理...
2010 五月 07 14:08:18 INFO  cn.aw.task.TraversalProvince - ================================线程: shaoxing  开始处理...
2010 五月 07 14:08:18 INFO  cn.aw.task.TraversalProvince - ================================线程: jinhua  开始处理...
2010 五月 07 14:08:18 INFO  cn.aw.task.TraversalProvince - ================================线程: zhoushan  开始处理...
2010 五月 07 14:08:18 INFO  cn.aw.task.TraversalProvince - ================================线程: putuo  开始处理...
2010 五月 07 14:08:18 INFO  cn.aw.servlet.AjaxServlet - 任务缓存大小:0
2010 五月 07 14:08:18 INFO  cn.aw.task.CityTask - endTask:ningbo
2010 五月 07 14:08:18 INFO  cn.aw.task.CityTask - endTask:putuo
2010 五月 07 14:08:19 INFO  cn.aw.task.CityTask - endTask:hangzhou
2010 五月 07 14:08:19 INFO  cn.aw.task.CityTask - endTask:shaoxing
2010 五月 07 14:08:19 INFO  cn.aw.task.CityTask - endTask:jinhua
2010 五月 07 14:08:19 INFO  cn.aw.task.CityTask - 无法查询【zhoushan】的【1】信息,出错
2010 五月 07 14:08:19 INFO  cn.aw.task.CityTask - endTask:zhoushan
2010 五月 07 14:08:19 INFO  cn.aw.task.REHunt - 开始调用返回URL:http://localhost:8080/ws/ajax...
2010 五月 07 14:08:19 INFO  cn.aw.servlet.AjaxServlet - 已缓存结果:030c95364050453987c6b9a597e80295

如果你有更好的思路,欢迎探讨,主要解决查询效率问题和并发问题!

1
4
分享到:
评论

相关推荐

    Windows多线程编程技术与实例(C++)(PDF)

    《Windows多线程编程技术与实例(C++)》是一本深入探讨Windows环境下多线程编程的书籍,特别适合正在学习或已经从事C++多线程开发的人员阅读。本书通过丰富的实例,详细讲解了如何在Windows操作系统中利用C++进行...

    汪文君JAVA多线程编程实战(完整不加密)

    这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是并发处理的基础,对于构建高效、可扩展的系统至关重要。 Java多线程允许程序同时执行多个独立的代码...

    linux多线程编程.pdf

    在文档中,虽然没有明确提到互斥锁的使用,但是在实际的多线程编程中,互斥锁是一种重要的同步工具。此外,条件变量(condition variables)和读写锁(read-write locks)也是常用同步机制。 总结来说,Linux多线程...

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

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

    多线程编程实例适合网络编程人员

    在IT行业中,多线程编程是一项至关重要的技术,特别是在网络编程领域。多线程使得一个程序可以同时执行多个任务,从而提高系统效率和响应速度。本文将深入探讨多线程编程实例及其在网络编程中的应用。 首先,理解多...

    c#多线程编程实战(原书第二版)源码

    《C#多线程编程实战(原书第二版)源码》是一本深入探讨C#中多线程技术的专业书籍,其源码提供了丰富的实践示例,帮助读者掌握并发编程的核心概念和技术。在C#中,多线程是实现高性能、响应式应用程序的关键组成部分...

    Windows平台下的多线程编程

    ### Windows平台下的多线程编程:深入探讨 #### 引言 在计算机科学领域,多线程编程被视为提升软件性能和响应能力的关键技术之一。尤其在Windows平台上,多线程编程能够充分利用现代多核处理器的能力,实现并发处理...

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

    《Java多线程编程实战指南-核心篇》是一本深入探讨Java并发编程的书籍,旨在帮助读者掌握在Java环境中创建、管理和同步线程的核心技术。Java的多线程能力是其强大之处,使得开发者能够在同一时间执行多个任务,提高...

    多线程编程指南

    在IT行业中,多线程编程是一项至关重要的技术,特别是在iOS开发中。多线程使得应用程序能够同时执行多个任务,提高系统资源的利用率,提升用户体验。本文将深入探讨多线程编程的基本概念、实现方式以及在iOS开发中的...

    linux多线程编程的聊天软件 (论文)

    在本篇论文“Linux下多线程编程的聊天软件”中,作者李杨探讨了如何利用Linux操作系统和多线程编程技术开发一款功能完备的网络聊天软件。在信息时代的背景下,网络聊天工具已经成为日常生活中不可或缺的通讯手段,而...

    vc多线程编程实例

    在IT行业中,多线程编程是一项至关重要的技术,特别是在开发高效、响应迅速的应用程序时。本文将深入探讨“vc多线程编程实例”,并详细解释如何利用多线程技术提高程序性能。 首先,多线程是指在一个应用程序中同时...

    .NET多线程编程

    本章节将深入探讨与多线程编程相关的几个核心概念:进程与线程的区别、线程调度机制以及多线程程序的实际执行情况。 ##### 7.1.1 进程与线程的概念及其区别 **1. 进程的概念** 进程是操作系统中一个正在运行的...

    【免费2018】C#多线程编程实战_中文完整版(带书签目录)【PDF高清】.rar

    这本书全面覆盖了C#中的并发和多线程编程,旨在帮助读者掌握如何在多核处理器环境下有效利用系统资源,提高程序的执行效率和响应速度。 在C#编程中,多线程是一种关键的编程概念,它允许程序员在一个应用程序中同时...

    vc++下的多线程编程

    本文将深入探讨VC++中多线程编程的核心概念、API函数的使用方法,并通过一个简单的实例来展示如何在Windows平台上利用Win32 API进行多线程编程。 ### 多线程编程基础 多线程编程允许在单个程序中并发执行多个线程...

    C++面向对象多线程编程

    《C++面向对象多线程编程》是一本深入探讨如何在C++环境中利用面向对象特性进行多线程程序设计的专业书籍。它旨在帮助C++程序员掌握如何构建高效、稳定的多线程架构,以及如何实现增量多线程编程技术。通过本书,...

    多线程编程示例

    本文将深入探讨多线程编程的基础知识,以帮助初学者快速入门。 首先,我们需要理解什么是多线程。多线程是指在一个进程中同时执行多个独立的执行线程。在单核CPU系统中,操作系统通过时间片轮转的方式在不同线程...

    多线程编程技术

    总之,多线程编程技术是现代软件开发中不可或缺的一部分。通过合理地运用线程,我们可以编写出高效、响应迅速的应用。但同时,我们也必须注意线程同步和通信的问题,以防止出现不可预测的错误。深入理解和实践这些...

    C#多线程编程实例实战

    本文将深入探讨如何在C#中实现多线程编程,并通过具体的实例实战来帮助理解这一技术。 首先,多线程是指在一个进程中同时执行多个线程。在C#中,我们可以使用`System.Threading`命名空间中的类来创建和管理线程。...

    java 多线程编程指南

    这份“Java多线程编程指南”深入探讨了这一主题,为中级到高级的Java开发者提供了宝贵的资源。 首先,多线程的基础概念是理解整个主题的关键。线程是程序执行的最小单元,每个线程都有自己的程序计数器、虚拟机栈、...

Global site tag (gtag.js) - Google Analytics