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