How to make for looping through high efficiency using a simple thread pool

Below is a small problem I encountered when next project

1. Ordinary for loop (on meter reading equipment items, a common sense for a loop to be copied, but this is inefficient, particularly in a multi-device and a device for an intermediate stay 15 seconds before re-issued copy table instruction, the efficiency is extremely low.)

@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. The combination of high efficiency traversing thread pool (not a device after it copied the other equipment ordered execution, after the first device to start copying here, another device can be started simultaneously copy)

The following are two ways :( ignore my test timer)

@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();
		}

 

Published 141 original articles · won praise 33 · views 50000 +

Guess you like

Origin blog.csdn.net/qq_43560721/article/details/104834447