场景如下:
集团发查询请求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>> results = new HashMap<long>> (); //流水号-结果
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语法、面向对象设计、异常处理、多线程、集合框架、I/O流、网络编程、数据库连接等核心概念和应用的掌握程度。 试题部分通常会包含选择题、填空题和编程题。选择题多用于考核理论知识,...
五、多线程 学习如何创建和管理线程,理解线程同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法。了解ThreadLocal、volatile关键字以及守护线程的概念。 六、IO流 掌握输入/输出流的基本使用,...
- **并发容器**:如ConcurrentHashMap、BlockingQueue、ThreadPoolExecutor等在多线程环境下的应用。 4. **内存模型与垃圾回收** - **JVM内存结构**:堆、栈、方法区、本地方法栈等区域的划分和作用。 - **垃圾...
这份资料涵盖了Java语言基础、数据结构、多线程、并发编程、JVM、设计模式、Spring框架、数据库等相关知识领域,旨在帮助求职者全面了解并掌握Java技术栈的关键点。 首先,Java语言基础是面试中的常考点。你需要...
6. **多线程**: - 线程的创建:通过Thread类和实现Runnable接口。 - 线程同步:synchronized关键字、wait()、notify()、notifyAll()方法。 - 死锁和活锁:如何避免和解决线程安全问题。 7. **IO流**: - 字节...
5. **多线程** - 理解线程的生命周期,会创建和控制线程。 - 掌握同步机制,如synchronized关键字、Lock接口及其实现类。 - 学习线程池的使用和配置,如ThreadPoolExecutor。 6. **内存模型与垃圾回收** - 理解...
在Java提升阶段,可能会涉及异常处理、集合框架(如ArrayList、LinkedList、HashMap、TreeMap等)、IO流、多线程编程、网络编程、反射机制、注解等高级主题。这些内容不仅提升了编程的实用性,也为解决复杂问题提供...
五、多线程 1. 线程的创建与控制:Thread类、Runnable接口,以及sleep()、join()、yield()等方法。 2. 同步机制:synchronized、volatile、Lock接口等,理解可见性、原子性、有序性。 3. 线程池:ExecutorService、...
3. **多线程** - 线程的创建:通过Thread类和Runnable接口创建线程。 - 线程同步:理解synchronized关键字,wait()、notify()和notifyAll()方法,以及Lock接口。 - 线程池:ExecutorService、ThreadPoolExecutor...
6. **多线程**:演示如何在Java中创建和管理线程,实现并发处理。 7. **文件操作**:学习读写文件、目录管理等I/O操作。 8. **XML处理**:利用DOM、SAX等方式解析和生成XML文档。 9. **国际化与本地化**:了解如何使...
线程池、同步机制(如synchronized关键字、Lock接口)、并发工具类(如ExecutorService)等都是Java多线程编程的关键知识点。 4. **Java集合框架**: Java集合框架包括接口(如List、Set、Map)和实现类(如...
在mn-mobile中,Java的多线程机制是实现流畅用户体验的关键。通过并发处理,应用可以在后台下载漫画资源,而用户则可以继续在前端浏览,两者互不干扰,提升了整体性能。此外,Java的异常处理机制确保了程序在面对...
研讨会可能分析并发编程的最佳实践,如何避免死锁和竞态条件,以及如何利用并发提高多线程应用的效率。 5. **Java安全**:在网络安全日益重要的今天,Java的安全性也是重要议题。研讨会可能涉及Java的加密库、安全...
5. 并发与多线程:对于涉及多任务处理的题目,Java的并发工具类如ExecutorService、Semaphore等可以帮助实现高效的并发解决方案。 三、LeetCode-master项目分析 "leetcode-master"这个文件名可能指的是一个包含...
这涉及算法优化、延迟加载、多线程处理和GPU加速等技术。 6. 测试与调试:移动开发中的测试涵盖功能测试、性能测试、兼容性测试和用户体验测试。调试工具如Android Studio的Logcat和Profiler,以及Xcode的...
- 并发与多线程:理解线程安全、同步原语(如互斥锁、条件变量)和并发陷阱,提高程序的并行性能。 4. **模板元编程** - 一种在编译时进行计算的技术,可以用于生成高效的代码。可能的讨论包括Boost.MPL、SFINAE...
- **线程安全**:在进行数据处理时,需要确保数据访问是线程安全的,以避免并发访问带来的数据错误。 - **减少Bolt间通信**:为了提高处理效率,应尽量减少Bolt之间的通信,可以采用批处理等方式来优化数据处理流程...
《软件设计师真题(2004-2008)》是一份极其珍贵的复习资料,它汇聚了从2004年至2008年间的软件设计师考试的历年真题,对于备考者来说,这无疑是一座丰富的知识宝库。通过对这些真题的学习和研究,考生可以深入了解...
5. **多线程**:线程的创建(Thread类和Runnable接口)、同步机制(synchronized关键字、wait/notify、Lock接口)、线程池(ExecutorService)。 6. **IO流**:了解输入输出流的不同类型(字节流和字符流、节点流和...