网站建设对公司有什么意义,眉山网站建设,如何实现网站的纯静态化,模块化网站建设系统Callable接口#xff0c;实现多线程 1.实现 Callable接口#xff0c;相较于实现 Runnable 接口的方式#xff0c;优点是#xff1a;方法可以有返回值#xff0c;并且可以抛出异常 2.需要 FutureTask实现类的支持#xff0c;用于接收运算结果 3.result.get()#xff0c;接…Callable接口实现多线程 1.实现 Callable接口相较于实现 Runnable 接口的方式优点是方法可以有返回值并且可以抛出异常 2.需要 FutureTask实现类的支持用于接收运算结果 3.result.get()接收返回的计算结果在所有的线程没有执行完成之后这里是不会执行的 实现Callable接口 public class RealTimeRiskCallable implements CallableRealTimeRisk {private Logger logger LoggerFactory.getLogger(RealTimeRiskThread.class);private String path;//文件路径private Integer count;//计算文件名称加的区别private ListString deviceName;//设备名称private RealTimeRisk realTimeRisknew RealTimeRisk();//接收风险计算的结果public RealTimeRiskCallable(String path, Integer count,ListString deviceName) {this.path path;this.count count;this.deviceName deviceName;}Overridepublic RealTimeRisk call() throws Exception {try {String paththis.path;//到时候读取配置文件进行配置String bpaPathBPA_EXE_PATHthis.count;String realFilePathpath.substring(0,path.lastIndexOf(/))File.separatorcopyZhthis.count.dat;FileUtil.copyFile(path, realFilePath);//复制一个copyZh.dat文件真正用这个pathrealFilePath;new HealingDat().healing(path,bpaPath);ExecuteBPA bpaExecuteBPA.getANewInstance();Integer code bpa.execute(path,bpaPath);if(code ! 5) {System.err.println(dat文件计算出错!);}else{double lostdataElectricityUtil.getLoadData(bpa);//没有操作之前的负荷数据(损失负荷操作之前的负荷数据-操作过后的负荷数据)ElectricityUtil.setNormalData(lostdata);//存放没有操作之前的负荷值ReadAndWriteDAT readAndWriteDAT ReadAndWriteDAT.getANewInstance(path);EquipmentVo.setAutoStopBusCard(readAndWriteDAT.getAllNoteBCard());// 文件操作前注释的b卡(之后-之前失压的母线)ListString list2 ElectricityUtil.countStation(bpa.readDatFile());EquipmentVo.setThridStationNames(list2);//这里借用了setThridStationNames这个存放值System.out.println(lostdata);}logger.info(开始读取dat文件...);long start System.currentTimeMillis();DataSourceUtil.replaceFileStr(path, this.deviceName);//进行dat对应操作long end System.currentTimeMillis();logger.info(重新写入dat文件成功耗时(end-start)/1000S);realTimeRisknew RealTimeRiskManagerImpl().nowRisk(path,bpaPath);//实时风险计算logger.info(实时风险计算成功);} catch (Exception e) {logger.info(实时风险计算失败);e.printStackTrace();}return realTimeRisk;}public void setCount(Integer count) {this.count count;}public void setDeviceName(ListString deviceName) {this.deviceName deviceName;}
} 调用 /*** 多线程进行计算*/ListRealTimeRisk allResult new ArrayListRealTimeRisk();/*//测试数据list.clear();list.add(name南连乙线#type线路);list.add(name广生站#1主变#type主变name广生站#2主变#type主变); list.add(name广生站#2主变#type主变);*/ ExecutorService executorService Executors.newCachedThreadPool();RealTimeRiskCallable realTimeRiskCallable1 null;RealTimeRiskCallable realTimeRiskCallable2 null;FutureTaskRealTimeRisk result1null;FutureTaskRealTimeRisk result2null;RealTimeRisk realTimeRisknew RealTimeRisk();RealTimeRisk realTimeRisk2new RealTimeRisk();long startTimeSystem.currentTimeMillis();pathtempPath;//最初的dat路径上面进行过处理int minVale0;int event0;int temp0;for (int i 0; i list.size(); i) {/*** 目前发现5月份的dat和12月份的dat两个bpa手动快速点击可以进行同时计算但是最新的* 12月份的两个dat修改过名称)不能同时计算目前没有找到原因因此多线程计算也会出现问题* 暂时先注释掉还是先一个个计算多线程需要修改i2* BPA_EXE_PATH1C:\\psap32\\BIN\\pfnt.exe* BPA_EXE_PATH2C:\\copypsap32\\psap32\\BIN\\pfnt.exe*/
// if(list.size()-i2){
// realTimeRiskCallable1 new RealTimeRiskCallable(path,1,Arrays.asList(list.get(i)));
// realTimeRiskCallable2 new RealTimeRiskCallable(path,2,Arrays.asList(list.get(i1)));
// result1new FutureTaskRealTimeRisk(realTimeRiskCallable1);
// result2new FutureTaskRealTimeRisk(realTimeRiskCallable2);
// executorService.submit(result1);//Thread.sleep(5000);
// executorService.submit(result2);
// realTimeRiskresult1.get();//接收返回结果
// allResult.add(realTimeRisk);
// realTimeRisk2result2.get();//接收返回结果
// allResult.add(realTimeRisk2);
// }else{realTimeRiskCallable1 new RealTimeRiskCallable(path,1,Arrays.asList(list.get(i)));result1new FutureTaskRealTimeRisk(realTimeRiskCallable1);executorService.submit(result1);realTimeRiskresult1.get();//接收返回结果allResult.add(realTimeRisk);
// }//获取事故事件等级最低的不为零等级越低事故事件等级越高eventInteger.parseInt(allResult.get(i).getAccidentEventRank());if(event!0){if(temp0){minValeevent;temp;}else{if(eventminVale){minValeevent;}}}}long endTimeSystem.currentTimeMillis();logger.info(耗时(endTime-startTime)/1000S);logger.info(所有风险计算完成共有allResult.size()条风险记录); 转载于:https://www.cnblogs.com/yangcaiwen/p/10307412.html