如何设置块的超时?

时间:2014-02-12 12:17:20

标签: java timer profiling

如果在特定时间间隔内没有完成,我想跳过一个语句块。

例如

//block starts 

   while(m3.find())
                {
                 // System.out.println(m3.group());
                    patit = m3.group().replace("(54)", " ");
                    patit = patit.trim();
                     System.out.println("m3");
                }

                while(m4.find() )
                {
                //  System.out.println(m4.group());
                    patno = m4.group().replace("Patent No.: ", " ");
                    patno = patno.replace("Patent No: ", " ");
                    patno = patno.replace("Patent", " ");
                    patno = patno.replace("No.:", " ");
                    patno = patno.replace("No:", " ");
                    patno = patno.replace("Number: ", " ");
                    patno = patno.replace("Number.: ", " ");
                    patno =  patno.trim();
                     System.out.println("m4");
                }
//block ends

在上面的块中,如果块需要超过20秒才能完成,那么“继续”;必须发出声明(跳过for循环,这里没有给出)..

如何实现这个目标?

1 个答案:

答案 0 :(得分:0)

您可能需要考虑让该块在单独的线程中运行。如果您可以将该功能重构为一个实现Runnable的单独类,那么让该类在一个线程中运行并拥有一个名为isCompleted()的方法。调用你的新类的类可以做这样的事情(我只是从内存开始,并没有尝试编译或运行它,如果有任何错误就很抱歉):

YourNewClass otherObject = new YourNewClass();
Thread t = new Thread(otherObject);
t.start();
int sleepTime = 1000;
int timeLimit = 20000;
while(!otherObject.isCompleted() && time < timeLimit) {
    try {
        Thread.sleep(sleepTime);
    } catch(InterruptedException e) {
        //your error handling code
    }
    time += sleepTime;
}
if(!otherObject.isCompleted()) {
    otherObject.stop();
}

这样,如果otherObject完成或20秒后,while循环将退出。如果经过了20秒并且它仍在运行,那么就调用它上面的stop()方法。

当然,需要注意的是,根据官方Java文档,线程调度在技术上并不能保证,因此线程调度程序可以在返回上面的Thread.sleep(sleepTime)之前运行otherObject的run()方法,但它是不太可能,如果run()方法可能需要超过20秒。你可以通过在YourNewClass.run()的开头执行Thread.sleep(100)来降低它的可能性,这将使线程调度程序很可能返回到上面的代码并启动while循环。