我想在文件列表上运行我的程序。但是一些文件比预期的时间要长得多。所以我想在超时期限后终止线程/进程,并在下一个文件上运行程序。有没有简单的方法呢?我一次只能运行一个线程。
EDIT1:
对不起我以前不能说清楚。这是for
循环代码。
for (File file : files)
{
//Perform operations.
}
所以文件是Java程序文件,可以包含很多方法。如果方法的数量较少,我的分析工作正常。如果有很多说20种方法,它会持续执行并分析它们几个小时。所以在后一种情况下,我想完成执行并转到下一个java文件。
我没有任何单线程限制。如果多线程有效,它对我来说仍然有用。感谢。
答案 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;