如何在特定时间内运行Java程序?

时间:2014-04-07 20:50:33

标签: java

我想在文件列表上运行我的程序。但是一些文件比预期的时间要长得多。所以我想在超时期限后终止线程/进程,并在下一个文件上运行程序。有没有简单的方法呢?我一次只能运行一个线程。

EDIT1:

对不起我以前不能说清楚。这是for循环代码。

for (File file : files)
{
  //Perform operations. 

}

所以文件是Java程序文件,可以包含很多方法。如果方法的数量较少,我的分析工作正常。如果有很多说20种方法,它会持续执行并分析它们几个小时。所以在后一种情况下,我想完成执行并转到下一个java文件。

我没有任何单线程限制。如果多线程有效,它对我来说仍然有用。感谢。

3 个答案:

答案 0 :(得分:3)

这些事情通常都是多线程完成的。有关示例,请参阅How to timeout a thread

正如您所评论的那样,您正在寻找单线程解决方案。最好通过定期检查超时是否到期来完成。某些线程必须进行检查,并且由于您要求它只有一个线程,因此检查必须在代码的中间位置。

让我们说大部分时间花在一个循环中,逐行读取文件。你可以这样做:

long start = System.nanoTime();
while((line = br.readLine()) != null) {
    if(System.nanoTime() - start > 600E9) { //More than 10 minutes past the start.
        throw new Exception("Timeout!");
    }
    ... //Process the line.
}

答案 1 :(得分:2)

就像使用多线程一样快速举例说明:

首先,我们制作一个Runnable来处理File

class ProcessFile implements Runnable {
    File file;
    public ProcessFile(File file){
        this.file = file;
    }
    public void run(){
        //process the file here
    }
}

接下来我们实际将该类作为线程执行:

class FilesProcessor {

    public void processFiles(){
        //I guess you get the files somewhere in here
        ExecutorService executor = Executors.newSingleThreadExecutor();
        ProcessFile process;
        Future future;
        for (File file : files) {
            process = new ProcessFile(file);
            future = executor.submit(process);
            try {
                future.get(10, TimeUnit.MINUTES);
                System.out.println("completed file");
            } catch (TimeoutException e) {
                System.out.println("file processing timed out");
            }
        }
        executor.shutdownNow();
    }
}

因此我们遍历每个文件并进行处理。如果花费的时间超过10分钟,我们会收到超时异常并且线程将死亡。很容易就是馅饼。

答案 2 :(得分:1)

我认为你有一段时间或for循环来处理这些文件,每个循环回合读取一个计时器。

您可以使用以下方法衡量数据的处理时间:

 while(....){
       long start = System.currentTimeMillis();
        // ... the code being measured ...    
        long elapsedTime = System.currentTimeMillis() - start;
 }

或者可能在循环之前启动天文台我不知道

编辑: 因此,如果您有一个循环转换文件,您必须将somme时间度量放在代码中的某个特定点,如所述darius。

例如:

   for each file
           start = System.currentTimeMillis();
           //do some treatment
           elapsedTime = System.currentTimeMillis() - start;
           // do a more tratment
           elapsedTime = System.currentTimeMillis() - start;