`
zz13203778855
  • 浏览: 7536 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

并发分发处理实践

阅读更多
// 并行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;
	}
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    springmvc+spring线程池处理http并发请求数据同步控制问题

    1. Spring MVC通过DispatcherServlet接收HTTP请求,然后根据映射规则将请求分发给相应的Controller进行处理。默认情况下,每个请求都在单独的线程中执行,这意味着可以并行处理多个请求,提高系统响应速度。 2. 然而...

    高并发处理

    ### 高并发处理知识点详解 #### 一、高并发处理概览 ...通过对单机测试、瓶颈分析、优化迭代以及负载均衡和分布式部署等关键技术的理解和实践,可以有效提升系统的并发处理能力,为企业带来更大的价值。

    redis缓存处理并发操作,下载即可使用

    Redis,全称Remote Dictionary Server,是一款高性能的键值对存储系统,常被用作数据库、缓存和消息中间件。...通过学习和实践这个示例,你可以更好地理解和掌握如何在实际项目中利用Redis来优化高并发业务。

    Go语言构建高并发分布式系统实践.ppt

    在面对数亿级别的实时长连接和日数十亿量级的独特业务需求时,Go语言的并发模型能够有效地分发任务,确保服务的稳定性和性能。 Go语言在基础服务开发领域的主要优势体现在以下几个方面: 1. **开发体验**:Go语言...

    【Gopher China 2015】Go 语言构建高并发分布式系统实践

    ### Go语言构建高并发分布式系统实践 #### 演讲背景 本次演讲源自于Gopher China 2015大会,演讲者为360手机助手的周洋。该演讲主要围绕着Go语言在构建高并发分布式系统中的实践展开,通过具体的案例——360消息推...

    高并发解决方案

    在IT行业中,高并发解决方案是针对大量用户同时访问或操作同一系统、应用或服务时,保证系统稳定...文件"2016"可能包含的是2016年关于高并发解决方案的资料,深入学习这些资料,可以对当时的实践和趋势有更全面的了解。

    数据分发平台的架构设计与实践.pdf

    GoldenGate是一种实时数据复制解决方案,它能够实现低延迟的数据同步,尤其适合处理大规模、高并发的数据操作。在这个实践中,作者以浙江信泰保险公司的案例为背景,阐述了该公司面临的挑战:拥有众多的系统,如核心...

    基于python+Django的异步任务分发处理系统 主要是提供创建异步任务,处理异步任务,结果写入数据库。.zip

    【标题】基于Python+Django的异步任务分发处理系统是计算机科学中常见的一个应用场景,主要用于提升应用程序的性能和响应速度。在这个项目中,主要实现了创建、管理和存储异步任务的功能,使得复杂的计算或耗时操作...

    高并发web架构完整1

    总结,这份《高并发Web架构完整1》资料全面地介绍了从理论到实践,从基础架构到高级策略,用于构建高性能Web站点的各个方面。对于希望提升Web应用性能、应对高并发挑战的开发者来说,这是一个宝贵的资源库。

    java高并发项目的demo

    Nginx作为反向代理和负载均衡器,可以将用户的请求分发到不同的应用服务器上,实现了流量的分散,提高了系统的并发处理能力。Nginx可以根据服务器负载情况智能地分配请求,保证了系统的可用性和响应速度。 在...

    IOS多路并发

    在iOS开发中,多路并发(Multithreading)是一种重要的技术,它允许应用程序同时执行多个任务,提升用户体验,尤其在处理耗时操作如网络请求、数据解析或大型计算时更为关键。多路并发能充分利用设备的多核处理器,...

    java 高并发解决 思路

    在Java编程领域,高并发处理是一项至关重要的技术,特别是在构建大型、高性能的互联网应用时。本文将基于"java 高并发解决思路"这一主题,...在学习过程中,理论与实践相结合,才能更好地掌握高并发处理的技术要点。

    mysql高并发解决方案

    在读多写少的场景下,可以将读请求分发到从库,主库专注处理写操作。 7. **使用存储过程**:将多个操作组合成一个存储过程,减少网络通信次数,提高执行效率。 8. **并发控制**:合理设置事务隔离级别,避免死锁和...

    高并发书籍

    在大型系统中,单台服务器往往无法承受高并发压力,这时就需要通过负载均衡将请求分发到多个服务器,以提升系统的处理能力。负载均衡策略有多种,如轮询、权重分配、IP哈希等。 性能优化是高并发编程的另一大主题。...

    牛客网Linux高并发服务器开发.zip

    epoll是Linux环境下高效处理大量并发连接的关键,通过边缘触发或水平触发模式,可以减少不必要的上下文切换。 4. **并发与并行**: 并发是指多个任务在一段时间内交替执行,而并行是多个任务在同一时刻执行。Linux...

    高并发高流量网站构架

    CDN(内容分发网络)则更进一步,通过分布式节点将静态内容缓存到边缘服务器,减少主服务器的负担,并能提高用户访问速度。然而,这两种方法各有优劣,镜像可能增加维护成本,而CDN则需考虑内容更新同步的问题。 ...

    分布式在线商品交易平台订单分发系统设计.pdf

    综上所述,分布式在线商品交易平台的订单分发系统设计文档,不仅介绍了分布式系统架构在提升交易系统性能方面的重要性,还详细说明了订单分发系统的模块化设计、关键功能、技术选型以及它在实际教学实践中的应用价值...

    java统计高并发首页访问量,记录客户登录信息

    综上所述,这个项目涵盖了Spring框架的使用、高并发处理、数据库操作、并发控制和日志管理等多个知识点,是一个典型的Java Web开发实践案例。通过这样的项目,开发者可以提升在实际工作中的技能和经验。

    基于Node.js的高并发电商购物系统设计与实现

    【基于Node.js的高并发电商购物...总之,本文通过深入研究和实践,成功设计并实现了一个基于Node.js的高并发电商购物系统,展示了JavaScript全栈开发的优势,以及如何通过合理的技术选型和架构设计来应对高并发挑战。

Global site tag (gtag.js) - Google Analytics