下边是我下项目时遇到的小问题
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();
}