实现多线程Callable接口

Callable接口,实现多线程

 1.实现 Callable接口,相较于实现 Runnable 接口的方式,优点是:方法可以有返回值,并且可以抛出异常

 2.需要 FutureTask实现类的支持,用于接收运算结果

 3.result.get(),接收返回的计算结果,在所有的线程没有执行完成之后这里是不会执行的

实现Callable接口

public class RealTimeRiskCallable implements Callable<RealTimeRisk> {private Logger logger =LoggerFactory.getLogger(RealTimeRiskThread.class);private String path;//文件路径private Integer count;//计算文件名称加的区别private List<String> deviceName;//设备名称private RealTimeRisk realTimeRisk=new RealTimeRisk();//接收风险计算的结果public RealTimeRiskCallable(String path, Integer count,List<String> deviceName) {this.path = path;this.count = count;this.deviceName = deviceName;}@Overridepublic RealTimeRisk call() throws Exception {try {String path=this.path;//到时候读取配置文件进行配置String bpaPath="BPA_EXE_PATH"+this.count;String realFilePath=path.substring(0,path.lastIndexOf("/"))+File.separator+"copyZh"+this.count+".dat";FileUtil.copyFile(path, realFilePath);//复制一个copyZh.dat文件,真正用这个path=realFilePath;new HealingDat().healing(path,bpaPath);ExecuteBPA bpa=ExecuteBPA.getANewInstance();Integer code = bpa.execute(path,bpaPath);if(code != 5) {System.err.println("dat文件计算出错!");}else{double lostdata=ElectricityUtil.getLoadData(bpa);//没有操作之前的负荷数据(损失负荷=操作之前的负荷数据-操作过后的负荷数据)ElectricityUtil.setNormalData(lostdata);//存放没有操作之前的负荷值ReadAndWriteDAT readAndWriteDAT =ReadAndWriteDAT.getANewInstance(path);EquipmentVo.setAutoStopBusCard(readAndWriteDAT.getAllNoteBCard());// 文件操作前注释的b卡(之后-之前=失压的母线)List<String> 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)/1000+"S");realTimeRisk=new 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(List<String> deviceName) {this.deviceName = deviceName;}
}

调用:

                    /*** 多线程进行计算*/List<RealTimeRisk> allResult =new ArrayList<RealTimeRisk>();/*//测试数据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;FutureTask<RealTimeRisk> result1=null;FutureTask<RealTimeRisk> result2=null;RealTimeRisk realTimeRisk=new RealTimeRisk();RealTimeRisk realTimeRisk2=new RealTimeRisk();long startTime=System.currentTimeMillis();path=tempPath;//最初的dat路径,上面进行过处理int minVale=0;int event=0;int temp=0;for (int i = 0; i < list.size(); i++) {/*** 目前发现5月份的dat和12月份的dat,两个bpa手动快速点击可以进行同时计算,但是最新的* 12月份的两个dat(修改过名称),不能同时计算,目前没有找到原因,因此多线程计算也会出现问题* 暂时先注释掉,还是先一个个计算,多线程需要修改i+=2* BPA_EXE_PATH1=C:\\psap32\\BIN\\pfnt.exe* BPA_EXE_PATH2=C:\\copypsap32\\psap32\\BIN\\pfnt.exe*/
//                        if(list.size()-i>=2){
//                            realTimeRiskCallable1= new RealTimeRiskCallable(path,1,Arrays.asList(list.get(i)));
//                            realTimeRiskCallable2= new RealTimeRiskCallable(path,2,Arrays.asList(list.get(i+1)));
//                            result1=new FutureTask<RealTimeRisk>(realTimeRiskCallable1);
//                            result2=new FutureTask<RealTimeRisk>(realTimeRiskCallable2);
//                            executorService.submit(result1);//Thread.sleep(5000);
//                            executorService.submit(result2);
//                            realTimeRisk=result1.get();//接收返回结果
//                            allResult.add(realTimeRisk);
//                            realTimeRisk2=result2.get();//接收返回结果
//                            allResult.add(realTimeRisk2);
//                        }else{realTimeRiskCallable1= new RealTimeRiskCallable(path,1,Arrays.asList(list.get(i)));result1=new FutureTask<RealTimeRisk>(realTimeRiskCallable1);executorService.submit(result1);realTimeRisk=result1.get();//接收返回结果
                            allResult.add(realTimeRisk);
//                        }//获取事故事件等级最低的(不为零,等级越低,事故事件等级越高)event=Integer.parseInt(allResult.get(i).getAccidentEventRank());if(event!=0){if(temp==0){minVale=event;temp++;}else{if(event<minVale){minVale=event;}}}}long endTime=System.currentTimeMillis();logger.info("耗时:===>"+(endTime-startTime)/1000+"S");logger.info("===>所有风险计算完成!共有:"+allResult.size()+"条风险记录");

 

 

 

 

转载于:https://www.cnblogs.com/yangcaiwen/p/10307412.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

密码验证

用户在创建一个账户时&#xff0c;需要设置一个密码。密码的复杂程度是安全的保障之一&#xff0c;但是有些用户在设置密码时&#xff0c;总是把密码设置的过于简单&#xff0c;导致用户账户的安全存在威胁。因此&#xff0c;为了提高用户账户的安全性&#xff0c;添加了一个Ja…

阿里云windows/Linux 服务器建站教程,附WordPress配置方法

声明&#xff1a;文章仅供学习使用&#xff0c;故采用了多处链接&#xff0c;如有侵权&#xff0c;请私信我&#xff0c;立删。 最近看到一个学长做的验证界面&#xff0c;很简单的两个文本输入框&#xff0c;但是能给我们群里的小伙伴们做题提供一个验证答案的途径&#xff0…

Maven修改默认仓库为阿里云仓库

Maven 仓库默认在国外&#xff0c; 国内使用难免很慢&#xff0c;我们可以更换为阿里云的仓库。 第一步:修改 maven 根目录下的 conf 文件夹中的 setting.xml 文件&#xff0c;在 mirrors 节点上&#xff0c;添加内容如下&#xff1a; <mirrors><mirror><id>…

PHP语言结构详解

PHP语言结构 &#xff11;、语言结构释义   语言结构就是PHP语言的关键词&#xff0c;语言语法的一部分&#xff1b;   它不可以被用户定义或者添加到语言扩展或者库中&#xff1b;   它可以有也可以没有变量和返回值。 &#xff12;、为什么语言结构执行速度比函数快&…

查找算法——折半查找(JAVA)

折半查找 问题描述&#xff1a;给定一个整数X和整数A0&#xff0c;A1&#xff0c;A2……A(n-1)&#xff0c;后者已经预先排序并在内存中&#xff0c;求下标i使得Ai X &#xff0c;如果X不在数据中&#xff0c;则返回i -1。 我们首先可以想到的一种方法就是从左到右遍历&…

如何正确的检测对象类型?

在 javascript 中&#xff0c;我们常常用 typeof 运算符来检测对象的类型&#xff0c;在使用 typeof 检测引用类型的存储值会出现一个问题&#xff0c;无论引用的是什么类型的对象&#xff0c;它都会返回 "object"。这个时候我们往往会使用 instanceof instanceof 可…

PHP基于phpqrcode类生成二维码

使用ThinkPHP框架引入phpqrcode类生成二维码后&#xff0c;发现每次必须通过TP框架生成&#xff0c;略显繁琐&#xff0c;打算写一个简单的方法&#xff0c;然后运行php后直接批量生成二维码。方法也简单&#xff0c;直接写个PHP脚本&#xff0c;然后引入phpqrcode类&#xff0…

求最大公约数——欧几里得算法(JAVA)

欧几里得算法 问题描述&#xff1a;给出两个数m&#xff0c;n&#xff0c;求解这两个数的最大公因数 由于算法比较简单&#xff0c;这里不再赘述&#xff0c;我做的这个算法是默认了m>n,如果是对于任意两个数来说的话&#xff0c;我们这里还需要一个比较大小。 public cla…

编写函数digit(num, k),函数功能是:求整数num从右边开始的第k位数字的值,如果num位数不足k位则返回0。...

function digit(num,k){var knum 0;for(var i1; i<k; i){knum num%10;num parseInt(num/10);}return knum;}转载于:https://www.cnblogs.com/tis100204/p/10310140.html

JS/jQuery添加和移除CSS样式

有时候需要添加CSS样式和移除CSS样式&#xff0c;如添加display属性&#xff0c;设为隐藏。有时候需要移除display属性。 一、jQuery移除CSS样式的两种方法 注意&#xff1a;当其中一种不支持时&#xff0c;就尝试另一种&#xff1a; $("#show").removeAttr("…

高效幂运算(JAVA)--拆分解法、二进制解法

高效幂运算 问题描述&#xff1a;假设有一机器能够存储这样一些大整数&#xff08;或有一个编译程序能够模拟它&#xff09;&#xff0c;求一个相对大的数字&#xff08;一般为400位左右&#xff09;的极大幂&#xff08;400位左右&#xff09; 显然我们可以使用Java内置函数p…

动态规划之背包问题(JAVA)

背包问题之前的C语言版本已经将思路解析的差不多&#xff0c;虽然还有些许错误需要改正&#xff0c;但大体思路是正确的&#xff0c;需要的读者请参阅动态规划之背包问题&#xff08;C语言&#xff09; 背包问题本身就是典型的动态规划问题&#xff0c;所以这里只给出动态规划…

PHP常量:define和const的不同之处

&#xff11;、定义   常量是一个简单的标识符。在脚本执行期间该值不能改变&#xff08;除了所谓的魔术常量&#xff0c;他们其实不是常量&#xff09;。常量默认大小写敏感。通常常量标识符总是大写的。   可以用define()函数来定义常量。在php5.3.0以后&#xff0c;可以…

js--a标签带参数href取值

<script type"text/javascript"> $(function(){ //$(div里面a标签的class名字)。attr&#xff08;‘href’&#xff0c;‘路径已经后面带的参数’&#xff09; $(.a).attr(href,/meeting/register_personal/findSeatPhoto.do?actionIdmeeting_register_detail…

斐波那契数列(一)--对比递归与动态规划(JAVA)

兔子繁殖问题&#xff1a; 这是一个有趣的古典数学问题&#xff0c;著名意大利数学家Fibonacci曾提出一个问题&#xff1a;有一对小兔子&#xff0c;从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。按此规律&#xff0c;假设没有兔子死亡&…

MySQL中的char与varchar详解

mysql中char与varchar的区别 char&#xff1a;定长&#xff0c;效率高&#xff0c;一般用于固定长度的表单提交数据存储 &#xff1b;例如&#xff1a;身份证号&#xff0c;手机号&#xff0c;电话&#xff0c;密码等 varchar&#xff1a;不定长&#xff0c;效率偏低 …

C++初步学习

C语言的变量必须在函数开始定义&#xff0c;而C可以边使用变定义C不支持重载&#xff0c;C函数支持重载&#xff0c;函数参数数量不同 或者 函数参数类型不同即可重载C的命名空间C语言不允许使用空的结构体(struct)&#xff0c;C允许使用空的结构体(class)C面向过程&#xff0c…

排序算法(一)--桶排序、冒泡、快排(JAVA)

排序算法汇总 参考书籍–《啊哈&#xff01;算法》 作者&#xff1a;啊哈磊 首先提出一个问题&#xff1a;班内有5名同学&#xff0c;成绩分别为5&#xff0c;8&#xff0c;2&#xff0c;4&#xff0c;2分&#xff08;满分10分&#xff09;&#xff0c;需要将成绩从小到大排序…

apache启动错误 AH00072: make_sock: could not bind to address [::]:443

一、安装apche遇到问题 在电脑上win7系统中安装了wnmp&#xff08;nginxMySQLphp7.2&#xff09;后&#xff0c;想要在安装一套wamp&#xff08;apacheMySQLphp7.2&#xff09;。说做就做&#xff0c;wamp的安装就比较简单了&#xff1a;首先&#xff0c;直接下载apache的压缩包…

Page9:结构分解以及系统内部稳定和BIBO稳定概念及其性质[Linear System Theory]

内容包含系统能控性结构分解、系统能观测性结构分解以及系统结构规范分解原理&#xff0c;线性系统的内部稳定、BIBO稳定概念及其性质 转载于:https://www.cnblogs.com/ERFishing/p/10314720.html