java循环调用进程运行bat文件,每调用一次进程前进行等待20分钟

    小弟要实现一下的功能:

    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);

  

你可以这样写
[code="java"]
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);

[/code]

你也可以这样写
[quote]
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);

[/quote]
你都可以试试看

让线程休眠 20 分钟
[code="java"]Thread.sleep(TimeUnit.MINUTES.toMillis(20));[/code]

你可以还一种思路

我开一个定时任务
每20分钟检查一次
如果数据完整,就执行bat命令,关闭定时任务
如果数据不完整,本次定时任务执行完,等待下次一次执行
[code="java"]
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);

[/code]

此外,你的
[code="java"]
process = Runtime.getRuntime().exec("D:\etlpath\BillFtp\ftpdown.BAT");

[/code]
写的非常有问题,你可以参阅[url=http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1]When Runtime.exec() won'[/url]的good example

忘记了,exec()完毕以后,别忘记了shutdown

完整的应该是
[code="java"]
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);

[/code]