// 并行xxx个线程直接进行送分
public void concurrentAddPoint(List<MppCumulativeDetails> detailsList,List<String> statList, int addSum) {// 初始化任务池
if (CollectionUtils.isEmpty(detailsList))
return;
// 初始化任务
long time = System.currentTimeMillis();
int totalSize = detailsList.size();
int concurrentSize = (totalSize + addSum) / addSum;
Executer exe = new Executer(concurrentSize);
for (int i = 0; i < concurrentSize; i++) {
List<MppCumulativeDetails> l = null;
if (i < concurrentSize - 1) {
l = detailsList.subList(i * addSum, (i + 1) * addSum);
} else {
l = detailsList.subList(i * addSum, detailsList.size());
}
ConcurrentJob job = new ConcurrentJob(l,statList);
exe.fork(job);// 派发任务
}
// 汇总任务结果
int result = (Integer) exe.join();
logger.info("ConcurrentAdding result:"+result);
logger.info("ConcurrentAdding Info: totalSize[ " + totalSize + " ], threadSize[ " + concurrentSize + " ], addSum[ " + addSum + " ]");
logger.info("ConcurrentAdding Cost Time: " + (System.currentTimeMillis() - time));
exe.shutdown();
}
class ConcurrentJob extends Job {
private List<MppCumulativeDetails> detailsList = new ArrayList<MppCumulativeDetails>();
private List<String> statList = new ArrayList<String>();
public ConcurrentJob(List<MppCumulativeDetails> detailsList,List<String> statList) {
super();
this.detailsList = detailsList;
this.statList = statList;
}
public Object execute() {
long time = System.currentTimeMillis();
try {
invokAddPointMethod(detailsList,statList);
} catch (Exception e) {
logger.error("ConcurrentAddPoint "+Thread.currentThread().getName() + "error!!!",e);
return 0;
}
logger.info("ConcurrentAddPoint thread = " + Thread.currentThread().getName() + " | size: " + detailsList.size() + " | time: " + (System.currentTimeMillis() - time));
return 1;
}
}
static class Executer {
// 存储任务的执行结果
private List<Future<?>> futres = new ArrayList<Future<?>>();
// 条件队列锁,以及线程计数器
public final Lock lock = new Lock();
// 线程池
private ExecutorService pool = null;
public Executer() {
this(1);
}
public Executer(int threadPoolSize) {
pool = Executors.newFixedThreadPool(threadPoolSize);
}
/**
* 任务派发
*
* @param job
*/
public void fork(Job job) {
// 设置同步锁
job.setLock(lock);
// 将任务派发给线程池去执行
futres.add(pool.submit(job));
// 增加线程数
synchronized (lock) {
lock.thread_count++;
}
}
/**
* 统计任务结果
*/
public int join() {
synchronized (lock) {
while (lock.thread_count > 0) {// 检查线程数,如果为0,则表示所有任务处理完成
// System.out.println("threadCount: "+THREAD_COUNT);
try {
lock.wait();// 如果任务没有全部完成,则挂起。等待完成的任务给予通知
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
int result = 0;
// 取出每个任务的处理结果,汇总后返回
for (Future<?> future : futres) {
try {
Object o = future.get();// 因为任务都已经完成,这里直接get
if (null != o)
result += ((Integer) o);
} catch (Exception e) {
e.printStackTrace();
}
}
return result;
}
public void shutdown() {
pool.shutdown();
futres = null;
pool = null;
}
}
static abstract class Job implements Callable<Object> {
// 锁
private Lock lock = null;
void setLock(Lock lock) {
this.lock = lock;
}
public Object call() throws Exception {
Object result = null;
try {
result = this.execute();// 执行子类具体任务
} catch (Exception e) {
e.printStackTrace();
}
synchronized (lock) {
// 处理完业务后,任务结束,递减线程数,同时唤醒主线程
lock.thread_count--;
lock.notifyAll();
}
return result;
}
/**
* 业务处理函数
*/
public abstract Object execute();
}
static class Lock {
// 线程数
int thread_count;
}
分享到:
相关推荐
1. Spring MVC通过DispatcherServlet接收HTTP请求,然后根据映射规则将请求分发给相应的Controller进行处理。默认情况下,每个请求都在单独的线程中执行,这意味着可以并行处理多个请求,提高系统响应速度。 2. 然而...
### 高并发处理知识点详解 #### 一、高并发处理概览 ...通过对单机测试、瓶颈分析、优化迭代以及负载均衡和分布式部署等关键技术的理解和实践,可以有效提升系统的并发处理能力,为企业带来更大的价值。
Redis,全称Remote Dictionary Server,是一款高性能的键值对存储系统,常被用作数据库、缓存和消息中间件。...通过学习和实践这个示例,你可以更好地理解和掌握如何在实际项目中利用Redis来优化高并发业务。
在面对数亿级别的实时长连接和日数十亿量级的独特业务需求时,Go语言的并发模型能够有效地分发任务,确保服务的稳定性和性能。 Go语言在基础服务开发领域的主要优势体现在以下几个方面: 1. **开发体验**:Go语言...
### Go语言构建高并发分布式系统实践 #### 演讲背景 本次演讲源自于Gopher China 2015大会,演讲者为360手机助手的周洋。该演讲主要围绕着Go语言在构建高并发分布式系统中的实践展开,通过具体的案例——360消息推...
在IT行业中,高并发解决方案是针对大量用户同时访问或操作同一系统、应用或服务时,保证系统稳定...文件"2016"可能包含的是2016年关于高并发解决方案的资料,深入学习这些资料,可以对当时的实践和趋势有更全面的了解。
GoldenGate是一种实时数据复制解决方案,它能够实现低延迟的数据同步,尤其适合处理大规模、高并发的数据操作。在这个实践中,作者以浙江信泰保险公司的案例为背景,阐述了该公司面临的挑战:拥有众多的系统,如核心...
【标题】基于Python+Django的异步任务分发处理系统是计算机科学中常见的一个应用场景,主要用于提升应用程序的性能和响应速度。在这个项目中,主要实现了创建、管理和存储异步任务的功能,使得复杂的计算或耗时操作...
总结,这份《高并发Web架构完整1》资料全面地介绍了从理论到实践,从基础架构到高级策略,用于构建高性能Web站点的各个方面。对于希望提升Web应用性能、应对高并发挑战的开发者来说,这是一个宝贵的资源库。
Nginx作为反向代理和负载均衡器,可以将用户的请求分发到不同的应用服务器上,实现了流量的分散,提高了系统的并发处理能力。Nginx可以根据服务器负载情况智能地分配请求,保证了系统的可用性和响应速度。 在...
在iOS开发中,多路并发(Multithreading)是一种重要的技术,它允许应用程序同时执行多个任务,提升用户体验,尤其在处理耗时操作如网络请求、数据解析或大型计算时更为关键。多路并发能充分利用设备的多核处理器,...
在Java编程领域,高并发处理是一项至关重要的技术,特别是在构建大型、高性能的互联网应用时。本文将基于"java 高并发解决思路"这一主题,...在学习过程中,理论与实践相结合,才能更好地掌握高并发处理的技术要点。
在读多写少的场景下,可以将读请求分发到从库,主库专注处理写操作。 7. **使用存储过程**:将多个操作组合成一个存储过程,减少网络通信次数,提高执行效率。 8. **并发控制**:合理设置事务隔离级别,避免死锁和...
在大型系统中,单台服务器往往无法承受高并发压力,这时就需要通过负载均衡将请求分发到多个服务器,以提升系统的处理能力。负载均衡策略有多种,如轮询、权重分配、IP哈希等。 性能优化是高并发编程的另一大主题。...
epoll是Linux环境下高效处理大量并发连接的关键,通过边缘触发或水平触发模式,可以减少不必要的上下文切换。 4. **并发与并行**: 并发是指多个任务在一段时间内交替执行,而并行是多个任务在同一时刻执行。Linux...
CDN(内容分发网络)则更进一步,通过分布式节点将静态内容缓存到边缘服务器,减少主服务器的负担,并能提高用户访问速度。然而,这两种方法各有优劣,镜像可能增加维护成本,而CDN则需考虑内容更新同步的问题。 ...
综上所述,分布式在线商品交易平台的订单分发系统设计文档,不仅介绍了分布式系统架构在提升交易系统性能方面的重要性,还详细说明了订单分发系统的模块化设计、关键功能、技术选型以及它在实际教学实践中的应用价值...
综上所述,这个项目涵盖了Spring框架的使用、高并发处理、数据库操作、并发控制和日志管理等多个知识点,是一个典型的Java Web开发实践案例。通过这样的项目,开发者可以提升在实际工作中的技能和经验。
【基于Node.js的高并发电商购物...总之,本文通过深入研究和实践,成功设计并实现了一个基于Node.js的高并发电商购物系统,展示了JavaScript全栈开发的优势,以及如何通过合理的技术选型和架构设计来应对高并发挑战。