`

java多线程实现流程汇聚

 
阅读更多
场景如下:
集团发查询请求A给省内,A包含2个子请求A1、A2。由于集团和省内模型不一致,省内的查询接口是以省内模型为最小粒度。
A1映射为省内的B1和B2,A2映射为省内的B3和B4,所以此问题转化为省内需要查询B1、B2、B3、B4,但是需要保证的是:
1、B1和B2的查询结果要转化为A1,返回给集团,所以需要界限B1-4的结果响应边界。
2、B1-4的执行需要并行,以保证效率。
解决方式如下(利用java.util.concurrent.*):
1、建立线程池,管理线程。
	public class DThreadPool extends ThreadPoolExecutor{
		public void execute(Runnable command) {
			super.execute(command);
		}
	}
	public class DThreadFactory implements ThreadFactory {
		public Thread newThread(Runnable r) {
			return new DThread(r);
		}
	}
	public class DThread extends Thread {
		public DThread(Runnable r) {
			super(r);
			this.setName("Soo_DThread");
		}
	}
2、每个线程处理一个省内查询请求,如B1、B2
	public class DTask implements Runnable {
		private Model model;
		// beans
		public DTask(Model model){
			this.model = model;
			// beans init
		}
		public void run() {
			// 处理业务场景
		}
	}
3、额外记录每个集团请求的流水号,以及该流水的查询进度和查询结果
	public class DThreadPoolExecutor {
		public static final DThreadPoolExecutor instance = new DThreadPoolExecutor();
		public static DThreadPool executor;
		private static Map<long> counter = new HashMap<long> (); //流水号-计数
		private static Map<long>&gt; results = new HashMap<long>&gt; (); //流水号-结果
		private static Map<long> otherArgs = new HashMap<long>();//其他参数
		private static Map beans = new HashMap ();
		private static Map<long> errCount = new HashMap<long> ();// 线程内报错计数
		private DThreadPoolExecutor() {
		}
		public static DThreadPoolExecutor getInstance() {
			return instance;
		}
		public void start(int corePoolSize,int maximumPoolSize,int keepAliveTime,int poolBufferSize){
			executor = new DThreadPool(corePoolSize,maximumPoolSize,keepAliveTime,poolBufferSize);
		}
		synchronized public static void ascCounter(Long batch){
			Integer count = counter.get(batch);
			if(count == null)
				count = 0;
			count++;
			counter.put(batch, count);
		}	
		
		//其他参数的getter/setter同步方法
	}
4、实际业务调用类中,需要做的工作有:构建业务模型类,传递给线程;循环等待线程处理结果计数,待流水查询结束后将 结果拿出来,转化拼装(如:等待B1、B2都处理完成才将结果拿出来,实际中省内查询是乱序的)。
	public class XXService{
		synchronized private String solve(args){
			// 构建任务
			Model model = new Model();
			//model.setXXX
			DTask task = new DTask(model);
			exec.submitTask(task);
			DThreadPoolExecutor.ascCounter(流水号);
			
			//计数归零则拿出结果
			while(true){
				Integer count = DThreadPoolExecutor.getCounter(batch);
				SooException errCount = DThreadPoolExecutor.getErr(batch);
				if(EmptyUtil.isNotEmpty(errCount)){
					// 如果该批次所有线程中有一个线程报错,则后续线程没有继续执行的必要
					sb.append(errCount.getMessage());
					remove(batch);
					throw errCount;
				}
				if(count == 0){
					List<string> results = DThreadPoolExecutor.getResult(batch);
					if(EmptyUtil.isNotEmpty(results)){
						for(String s : results){
							sb.append(s);
						}
					}
					remove(batch);
					break;
				}
			}
		}
	}
分享到:
评论

相关推荐

    Java考证历年试题以及参考答案

    这些认证主要测试考生对Java语法、面向对象设计、异常处理、多线程、集合框架、I/O流、网络编程、数据库连接等核心概念和应用的掌握程度。 试题部分通常会包含选择题、填空题和编程题。选择题多用于考核理论知识,...

    Java面试宝典合集 Java面试宝典合集

    五、多线程 学习如何创建和管理线程,理解线程同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法。了解ThreadLocal、volatile关键字以及守护线程的概念。 六、IO流 掌握输入/输出流的基本使用,...

    Java-Interview-超全集合github上评分最高的jiva面试题

    - **并发容器**:如ConcurrentHashMap、BlockingQueue、ThreadPoolExecutor等在多线程环境下的应用。 4. **内存模型与垃圾回收** - **JVM内存结构**:堆、栈、方法区、本地方法栈等区域的划分和作用。 - **垃圾...

    java面试集锦大全

    这份资料涵盖了Java语言基础、数据结构、多线程、并发编程、JVM、设计模式、Spring框架、数据库等相关知识领域,旨在帮助求职者全面了解并掌握Java技术栈的关键点。 首先,Java语言基础是面试中的常考点。你需要...

    java笔试集

    6. **多线程**: - 线程的创建:通过Thread类和实现Runnable接口。 - 线程同步:synchronized关键字、wait()、notify()、notifyAll()方法。 - 死锁和活锁:如何避免和解决线程安全问题。 7. **IO流**: - 字节...

    java 面试试题集

    5. **多线程** - 理解线程的生命周期,会创建和控制线程。 - 掌握同步机制,如synchronized关键字、Lock接口及其实现类。 - 学习线程池的使用和配置,如ThreadPoolExecutor。 6. **内存模型与垃圾回收** - 理解...

    课外补充知识全集.rar

    在Java提升阶段,可能会涉及异常处理、集合框架(如ArrayList、LinkedList、HashMap、TreeMap等)、IO流、多线程编程、网络编程、反射机制、注解等高级主题。这些内容不仅提升了编程的实用性,也为解决复杂问题提供...

    2012 java面试宝典

    五、多线程 1. 线程的创建与控制:Thread类、Runnable接口,以及sleep()、join()、yield()等方法。 2. 同步机制:synchronized、volatile、Lock接口等,理解可见性、原子性、有序性。 3. 线程池:ExecutorService、...

    精选:面试必备的java试题

    3. **多线程** - 线程的创建:通过Thread类和Runnable接口创建线程。 - 线程同步:理解synchronized关键字,wait()、notify()和notifyAll()方法,以及Lock接口。 - 线程池:ExecutorService、ThreadPoolExecutor...

    jbuilder_100example.rar_jbuilder

    6. **多线程**:演示如何在Java中创建和管理线程,实现并发处理。 7. **文件操作**:学习读写文件、目录管理等I/O操作。 8. **XML处理**:利用DOM、SAX等方式解析和生成XML文档。 9. **国际化与本地化**:了解如何使...

    CTS_seminar:CTS 2021研讨会

    线程池、同步机制(如synchronized关键字、Lock接口)、并发工具类(如ExecutorService)等都是Java多线程编程的关键知识点。 4. **Java集合框架**: Java集合框架包括接口(如List、Set、Map)和实现类(如...

    mn-mobile:漫画网络的移动客户端

    在mn-mobile中,Java的多线程机制是实现流畅用户体验的关键。通过并发处理,应用可以在后台下载漫画资源,而用户则可以继续在前端浏览,两者互不干扰,提升了整体性能。此外,Java的异常处理机制确保了程序在面对...

    SeminarCTS:CTS 2021研讨会

    研讨会可能分析并发编程的最佳实践,如何避免死锁和竞态条件,以及如何利用并发提高多线程应用的效率。 5. **Java安全**:在网络安全日益重要的今天,Java的安全性也是重要议题。研讨会可能涉及Java的加密库、安全...

    leetcode

    5. 并发与多线程:对于涉及多任务处理的题目,Java的并发工具类如ExecutorService、Semaphore等可以帮助实现高效的并发解决方案。 三、LeetCode-master项目分析 "leetcode-master"这个文件名可能指的是一个包含...

    移动开发大会精彩PPT

    这涉及算法优化、延迟加载、多线程处理和GPU加速等技术。 6. 测试与调试:移动开发中的测试涵盖功能测试、性能测试、兼容性测试和用户体验测试。调试工具如Android Studio的Logcat和Profiler,以及Xcode的...

    cpp-CppCon2015的演讲材料

    - 并发与多线程:理解线程安全、同步原语(如互斥锁、条件变量)和并发陷阱,提高程序的并行性能。 4. **模板元编程** - 一种在编译时进行计算的技术,可以用于生成高效的代码。可能的讨论包括Boost.MPL、SFINAE...

    唯品会日志平台架构介绍

    - **线程安全**:在进行数据处理时,需要确保数据访问是线程安全的,以避免并发访问带来的数据错误。 - **减少Bolt间通信**:为了提高处理效率,应尽量减少Bolt之间的通信,可以采用批处理等方式来优化数据处理流程...

    软件设计师真题(2004-2008)

    《软件设计师真题(2004-2008)》是一份极其珍贵的复习资料,它汇聚了从2004年至2008年间的软件设计师考试的历年真题,对于备考者来说,这无疑是一座丰富的知识宝库。通过对这些真题的学习和研究,考生可以深入了解...

    Mock-Interview-Questions:来自careercup、glassdoor和其他来源的预测

    5. **多线程**:线程的创建(Thread类和Runnable接口)、同步机制(synchronized关键字、wait/notify、Lock接口)、线程池(ExecutorService)。 6. **IO流**:了解输入输出流的不同类型(字节流和字符流、节点流和...

Global site tag (gtag.js) - Google Analytics