在Java中,我有一个以某种方式处理文本文件的函数。但是,如果花费太多时间,该过程很可能对该文本文件无用(无论原因是什么),我想跳过它。此外,如果过程耗时太长,它也会占用太多内存。我试图以这种方式解决它,但它不起作用:
for (int i = 0; i<docs.size(); i++){
try{
docs.get(i).getAnaphora();
}
catch (Exception e){
System.err.println(e);
}
}
其中docs
只是目录中List
个文件。通常我必须手动停止代码,因为它“卡在”特定文件(取决于该文件的内容)。
有没有办法测量该函数调用的时间,并告诉Java跳过该函数所需的文件,比如10秒?
修改
在将几个不同的答案拼凑在一起之后,我想出了这个解决方案,它运行正常。也许其他人也可以使用这个想法。
首先创建一个实现Runable的类(这样你可以根据需要将参数传递给Thread):
public class CustomRunnable implements Runnable {
Object argument;
public CustomRunnable (Object argument){
this.argument = argument;
}
@Override
public void run() {
argument.doFunction();
}
}
然后在main
类中使用此代码来监视函数的时间(argument.doFunction()
),如果需要很长时间则退出:
Thread thread;
for (int i = 0; i<someObjectList.size(); i++){
thread = new Thread(new CustomRunnable(someObjectList.get(i)));
thread.start();
long endTimeMillis = System.currentTimeMillis() + 20000;
while (thread.isAlive()) {
if (System.currentTimeMillis() > endTimeMillis) {
thread.stop();
break;
}
try {
System.out.println("\ttimer:"+(int)(endTimeMillis - System.currentTimeMillis())/1000+"s");
thread.sleep(2000);
}
catch (InterruptedException t) {}
}
}
我意识到stop()
已经被删除了,但是当我希望它停止时,我还没有找到任何其他方法来停止和退出该线程。
答案 0 :(得分:8)
将代码包裹在Runnable
或Callable
中,并将其提交给合适的执行程序以执行它。其中一个提交方法需要一段超时时间,之后代码被中断。
答案 1 :(得分:0)
您可以在运行方法中使用System.nanoTime()
作为条件。
例如,
long cur = System.nanoTime(); //records the time when start executing
...
double elapsedTime(System.nanoTime() - cur) / 1000000.0; // at the end
答案 2 :(得分:0)
Runnable的详细解决方案(请参阅前面的thorbjorn的答案):
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.execute(() ->doFunction()); //here is the Runnable (represented as simple lambda here)
executorService.shutdown();
try {
if (!executorService.awaitTermination(2000, TimeUnit.MILLISECONDS)) {
System.out.println("ERROR: Stopping going to next step");
}
}catch(InterruptedException e){
e.printStackTrace();
}