如何让for循环高效率遍历之线程池的简单使用

下边是我下项目时遇到的小问题

1.普通for循环(项目上的设备抄表,常理来说for循环是一个一个来抄的,但是这样效率低下,特别是在设备多并且某设备需中间停留15秒后才可再次下发抄表指令时,效率是极其低的。)

@Scheduled(cron = "0 */7 * * * ?")
	public void updeteYM() {
		System.out.println("---Scheduled=YM测试测试---"+new Date());
		new Thread() {
			public void run() {
				GatewayPo gateway = new GatewayPo();
				gateway.setType(3);
				List<GatewayPo> all_gateway = gatewayService.findGateway(gateway);
				if (all_gateway.size()!=0) {
					for (int i = 0; i < all_gateway.size(); i++) {
						YmDevice ym = new YmDevice();
						ym.setGwid(all_gateway.get(i).getId());
//						ym.setStatus("1");
						List<YmDevice> all_dev = ymDeviceService.findYMdevice(ym);
						if (all_dev.size()!=0) {
							for (int j = 0; j < all_dev.size(); j++) {						
								try {
									//循环抄表
									switch (all_dev.get(j).getType()) {
									case "64":					
										new YmCode().Get_Watt_Munber(all_dev.get(j).getNumber(), all_gateway.get(i).getGwid());
										break;
									default://冷、热水表
										new YmCode().Get_Watter_Munber(all_dev.get(j).getNumber(), all_gateway.get(i).getGwid(), all_dev.get(j).getType());
										break;
									}
									System.out.println("抄表完成 ---开始停止15秒");
									Thread.sleep(15000);
									System.out.println("抄表完成 ---停止15秒结束");
								} catch (Exception e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}
							}
						}
					}
				}			
				
		    }
		}.start();
	}

2.结合线程池高效率遍历(不用一个设备抄完之后其他设备才有序执行,这里第一个设备开始抄之后,另一个设备也可同时开始进行抄)

以下是两种方式:(忽略我的定时器测试)

@Scheduled(cron = "0 */3 * * * ?")
	public void updeteYM2() {
		System.out.println("---YMcb2---start--------------------"+new Date());
		new Thread() {
			public void run() {
				GatewayPo gateway = new GatewayPo();
				gateway.setType(3);
				List<GatewayPo> all_gateway = gatewayService.findGateway(gateway);
				ExecutorService pool = Executors.newCachedThreadPool();    
			    for (int i = 0; i < all_gateway.size(); i++) {   
			    	Integer gwid = all_gateway.get(i).getId();
			    	String gwidNum = all_gateway.get(i).getGwid();
			        Runnable run = new Runnable() {    
			            public void run() {    
			                try {    
			                	YmDevice ym = new YmDevice();
								ym.setGwid(gwid);
//								ym.setStatus("1");
								List<YmDevice> all_dev = ymDeviceService.findYMdevice(ym);
								if (all_dev.size()!=0) {
									for (int j = 0; j < all_dev.size(); j++) {						
										try {
											//循环抄表
											switch (all_dev.get(j).getType()) {
											case "64":					
												new YmCode().Get_Watt_Munber(all_dev.get(j).getNumber(), gwidNum);
												break;
											default://冷、热水表
												new YmCode().Get_Watter_Munber(all_dev.get(j).getNumber(), gwidNum, all_dev.get(j).getType());
												break;
											}
											System.out.println("抄表完成 ---开始停止15秒");
											Thread.sleep(15000);
											System.out.println("抄表完成 ---停止15秒结束");
										} catch (Exception e) {
											// TODO Auto-generated catch block
											e.printStackTrace();
										}
									}
								}
			                	
			                } catch (Exception e) {    
			                }    
			            }    
			        };   
			        pool.execute(run);    
			    } 
			    pool.shutdown();
		    }
		}.start();
	}
 @Scheduled(cron = "0 */50 * * * ?")
		public void updeteYM3() {
			System.out.println("---YMcb3---start-------------------"+new Date());
			new Thread() {
				public void run() {
					GatewayPo gateway = new GatewayPo();
					gateway.setType(3);
					List<GatewayPo> all_gateway = gatewayService.findGateway(gateway);
					Executor executor = Executors.newFixedThreadPool(all_gateway.size());		
			        for (int i = 0; i < all_gateway.size(); i++) {
			        	Integer gwid = all_gateway.get(i).getId();
				    	String gwidNum = all_gateway.get(i).getGwid();
			            executor.execute(new Runnable() {
			                @Override
			                public void run() {
			                	YmDevice ym = new YmDevice();
								ym.setGwid(gwid);
								ym.setStatus("1");
								List<YmDevice> all_dev = ymDeviceService.findYMdevice(ym);
								if (all_dev.size()!=0) {
									for (int j = 0; j < all_dev.size(); j++) {						
										try {
											//循环抄表
											switch (all_dev.get(j).getType()) {
											case "64":					
												new YmCode().Get_Watt_Munber(all_dev.get(j).getNumber(), gwidNum);
												break;
											default://冷、热水表
												new YmCode().Get_Watter_Munber(all_dev.get(j).getNumber(), gwidNum, all_dev.get(j).getType());
												break;
											}
											System.out.println("抄表完成 ---开始停止15秒");
											Thread.sleep(15000);
											System.out.println("抄表完成 ---停止15秒结束");
										} catch (Exception e) {
											// TODO Auto-generated catch block
											e.printStackTrace();
										}
									}
								}
			                }
			            });
			        }
			    }
			}.start();
		}

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值