java - 如何设置 block 超时?

标签 java timer profiling

如果语句 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/

相关文章:

java - 如何在 JButton 执行的操作中打开 pdf 文件,

java - 从 firebase 检索数据后需要反转 ListView

c++ - Qt5 : How to wait for a signal in a thread?

python - 如何在 Python 中分析多线程程序?

linux - 使用/proc/*/stat 进行分析

postgresql - 如何分析 PostgreSQL 数据库?

java - 使用 @Where 子句的 Hibernate @OneToOne 映射

java - 将 sprig 连接到 kafka 开始使用 docker compose 进行本地主机开发

java - 如何在 Java 中重置计时器?

swift - 定时器间隔不触发