如果语句 block 在特定时间间隔内未完成,我想跳过它。
例如
//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
在上面的 block 中,如果 block 需要超过 20 秒才能完成,则“继续”;必须发出语句(跳过 for 循环,此处未给出)。
如何实现?
最佳答案
您可能需要考虑让该 block 在单独的线程中运行。如果您可以将该功能重构为实现 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 循环。
关于java - 如何设置 block 超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21727716/