如何在运行正则表达式的java函数上设置时间限制

Yat*_*oel 5 java multithreading

我在java函数中运行正则表达式来解析文档,如果找到正则表达式指定的字符串则返回true,如果没有则返回false.但问题是,当文档不包含正则表达式指定的字符串时,返回false需要很长时间,如果执行时间超过6秒,我想终止该函数.

如何在该功能上设置6秒的时间限制,以便在超过6秒的时间内强制终止该功能.

我从类1调用类2的方法"方法1"."方法1"调用同一类的"方法2",即"类2".方法2在文档上运行正则表达式代码.如果它找到正则表达式指定的字符串,那么它将结果返回给方法1,方法1又将结果返回到"类1"中的方法,该方法调用了类2的"方法1".现在的问题是类2的method1和method2的执行时间不应超过6秒.

所以,我在同一个文件中创建了一个新的RegexpThread类,其中我的class2是.然后我将class2的method2移动到RegexpThread类中.然后每当调用方法1时,它都会实例化RegexpThread类,如下所示:

RegexpThread rt = new RegexpThread() {
    public void run() {
        method 2(m, urlCopy, document);
    }    
};

rt.start();

try {
    rt.join(6 * 1000);
} catch (InterruptedException e) {
    return "y";
}

if(rt.getResultXml().equals("")) {
    return "g";
}

resultXml.append(rt.getResultXml());

return resultXml.toString();
Run Code Online (Sandbox Code Playgroud)

显示的代码位于class2的方法1中.RegexpThread类中的方法2对文档执行一些正则表达式搜索.RegexpThread类中有一个名为"resultXml"的私有字段.如果方法2找到了正则表达式指定的字符串,则它将结果分配给私有字段"resultXml".如果不是,则"resultXml"包含其默认值,即空字符串.

因此,在上面的"if block"中,它正在针对空字符串检查"resultXml"字段.如果它是一个空字符串,那么这意味着正则表达式没有在文档中找到它的字符串.但是如果它不是空字符串那么这意味着正则表达式在文档中找到了字符串并将结果分配给"resultXml"字段.

所以,看看这个并告诉我该怎么做......

wax*_*ing 9

我可能在这里弄错了,但我认为终止一个线程的所有方法已经被弃用了一段时间.建议的方法是使用isRunning工作线程定期检查的共享变量,并在设置时正常退出.

这对你的情况不起作用,但它看起来像你在治疗症状 - 而不是真正的问题.你应该发布你的regexp函数的代码,需要6秒才能执行.如果它是re​​gexp本身,则执行时间可能是灾难性回溯的情况.


Tom*_*Tom -2

你所做的对我来说看起来不错,我将如何修改它:

final AtomicReference<String> resultXml = new AtomicReference<String>();

RegexpThread rt = new RegexpThread() {
  public void run() {
    method2(m, urlCopy, document, resultXml);
  }

};

rt.start();

try {
    rt.join(6 * 1000);
} catch (InterruptedException e) {
    return "y";
}

if(resultXml.get() == null) {
    rt.interupt();
    return "g";
}

resultXml.append(resultXml.get());

return resultXml.toString();
Run Code Online (Sandbox Code Playgroud)

  • Thread.interrupt 并没有做你想象的那样。它不会影响线程,除非它处于等待状态。 (3认同)