问题描述
小弟要实现一下的功能: 1、检查数据是否完整 2、进行拷贝数据 3、如果数据不完整,则等待20分钟后重新拷贝数据 4、检查数据是否完整,如果完整,则跳出循环 代码如下,请教各位大师,怎么实现 do{ //判断是否完整 for(int i = 0 ; i < nameLongth.length ; i++){ if(nameLongth[i].equals("sunlineTELFile.ctl")){ count_number = 1; } } //数据不完整,则等到20分钟后重新执行bat文件,等待20分钟需要怎么写? if (count_number!=1){ try { process = Runtime.getRuntime().exec("D:\etlpath\BillFtp\ftpdown.BAT"); } catch (IOException e) { e.printStackTrace(); } } //跳出 }while(count_number==1); 问题补充:可能我刚才说的不够清楚,我再说一次<br /> 1、检查数据是否完整<br /><br /> 2、如过数据不完整,则等待20分钟后重新拷贝数据(即运行BAT文件)<br /><br /> 3、如果数据完整,则直接跳出循环。<br /><br /> do{<br /> //判断是否完整<br /> for(int i = 0 ; i < nameLongth.length ; i++){<br /> if(nameLongth[i].equals("sunlineTELFile.ctl")){<br /> count_number = 1;<br /> } <br /> }<br /> //数据不完整,则等到20分钟后重新执行bat文件,等待20分钟需要怎么写?<br /> <br /> if (count_number!=1){<br /> try {<br /> process = Runtime.getRuntime().exec("D:\etlpath\BillFtp\ftpdown.BAT"); <br /> } catch (IOException e) {<br /> e.printStackTrace();<br /> }<br /> }<br /> //跳出<br /> }while(count_number==1);<br /><br />
解决方案
你可以这样写 do { //判断是否完整 boolean completeness = true; for (int i = 0; i < nameLongth.length; i++) { if (!nameLongth[i].equals("sunlineTELFile.ctl")) { completeness = false; break; } } //数据不完整,则等到20分钟后重新执行bat文件,等待20分钟需要怎么写? Thread.sleep(TimeUnit.MINUTES.toMillis(20)); if (completeness) { try { //你这种写法有可能造成没有执行,解决办法看[url=http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1]这帖子[/url] process = Runtime.getRuntime().exec("D:\etlpath\BillFtp\ftpdown.BAT"); } catch (IOException e) { e.printStackTrace(); } } //跳出 } while (!completeness);你也可以这样写引用 final ScheduledThreadPoolExecutor executror = new ScheduledThreadPoolExecutor(1); executror.scheduleAtFixedRate(new Runnable() { public void run() { //To change body of implemented methods use File | Settings | File Templates. // 1. 判断数据是否完整 for (int i = 0; i < nameLongth.length; i++) { if (!nameLongth[i].equals("sunlineTELFile.ctl")) { return; } } try { process = Runtime.getRuntime().exec("D:\etlpath\BillFtp\ftpdown.BAT"); } catch (IOException e) { e.printStackTrace(); } executror.shutdownNow(); } // 0 表示延时0秒启动,5表示每5秒钟重复一次 }, 0, 20, TimeUnit.MINUTES);你都可以试试看
解决方案二:
忘记了,exec()完毕以后,别忘记了shutdown完整的应该是 final ScheduledThreadPoolExecutor executror = new ScheduledThreadPoolExecutor(1); executror.scheduleAtFixedRate(new Runnable() { public void run() { //To change body of implemented methods use File | Settings | File Templates. // 1. 判断数据是否完整 boolean completeness = checkCompleteness(); //如果不完整 if(!completeness) { return; } //如果完整,执行bat exec(); executror.shutdownNow(); } // 0 表示延时0秒启动,5表示每5秒钟重复一次 }, 0, 5, TimeUnit.SECONDS);
解决方案三:
你可以还一种思路我开一个定时任务每20分钟检查一次如果数据完整,就执行bat命令,关闭定时任务如果数据不完整,本次定时任务执行完,等待下次一次执行 ScheduledThreadPoolExecutor executror = new ScheduledThreadPoolExecutor(1); executror.scheduleAtFixedRate(new Runnable() { public void run() { //To change body of implemented methods use File | Settings | File Templates. // 1. 判断数据是否完整 boolean completeness = checkCompleteness(); //如果不完整 if(!completeness) { return; } //如果完整,执行bat exec() } // 0 表示延时0秒启动,5表示每5秒钟重复一次 }, 0, 5, TimeUnit.SECONDS);此外,你的process = Runtime.getRuntime().exec("D:\etlpath\BillFtp\ftpdown.BAT"); 写的非常有问题,你可以参阅When Runtime.exec() won'的good example
解决方案四:
让线程休眠 20 分钟Thread.sleep(TimeUnit.MINUTES.toMillis(20));