9

在 Java 中,我有一个以某种方式处理文本文件的函数。但是,如果花费太多时间,该过程很可能对该文本文件无用(无论原因是什么),我想跳过它。此外,如果进程耗时过长,也会占用过多的内存。我试图以这种方式解决它,但它不起作用:

for (int i = 0; i<docs.size(); i++){
    try{
        docs.get(i).getAnaphora();
        }
    catch (Exception e){
        System.err.println(e);
    }
 }

wheredocs只是List目录中的一个文件。通常我必须手动停止代码,因为它“卡在”特定文件中(取决于该文件的内容)。

有没有办法测量该函数调用的时间并告诉Java跳过该函数花费的文件超过10秒?

编辑
在收集了几个不同的答案后,我想出了这个工作正常的解决方案。也许其他人也可以使用这个想法。

首先创建一个实现 Runable 的类(这样你可以在需要时将参数传递给线程):

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()它已经过时了,但是当我希望它停止时,我还没有找到任何其他方法来停止和退出线程。

4

3 回答 3

9

将您的代码包装在Runnableor中Callable并将其提交给合适的 Executor 以执行它。其中一个提交方法需要一个超时时间,之后代码被中断。

于 2013-04-20T14:04:38.490 回答
0

您可以使用System.nanoTime()内部运行方法作为条件。

例如,

long cur = System.nanoTime(); //records the time when start executing
...
double elapsedTime(System.nanoTime() - cur) / 1000000.0; // at the end
于 2013-04-20T14:10:32.313 回答
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();
            }
于 2020-08-18T19:36:42.493 回答