以下は、次のプロジェクト私が遭遇した小さな問題があります
検針機器の項目のループ(経常1.は、ループの常識がコピーされるが、これは特にマルチデバイスおよび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.高効率トラバーススレッドプールの組み合わせは、(それが他の機器の実行を命じコピーした後の最初のデバイスは、ここにコピーを開始した後、デバイスは、別のデバイスが同時に開始をコピーすることができません)
以下は、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();
}