gpt4 book ai didi

java - 取消长时间运行的正则表达式匹配?

转载 作者:IT老高 更新时间:2023-10-28 20:57:12 28 4
gpt4 key购买 nike

假设我正在运行一项服务,用户可以在其中提交正则表达式来搜索大量数据。如果用户提交了一个非常慢的正则表达式(即 Matcher.find() 返回需要几分钟),我想要一种取消该匹配的方法。我能想到的唯一方法是让另一个线程监视匹配需要多长时间,并在必要时使用 Thread.stop() 取消它。

成员变量:

long REGEX_TIMEOUT = 30000L;
Object lock = new Object();
boolean finished = false;
Thread matcherThread;

匹配线程:

try {
matcherThread = Thread.currentThread();

// imagine code to start monitor thread is here

try {
matched = matcher.find();
} finally {
synchronized (lock) {
finished = true;
lock.notifyAll();
}
}
} catch (ThreadDeath td) {
// send angry message to client
// handle error without rethrowing td
}

监控线程:

synchronized (lock) {
while (! finished) {
try {
lock.wait(REGEX_TIMEOUT);

if (! finished) {
matcherThread.stop();
}
} catch (InterruptedException ex) {
// ignore, top level method in dedicated thread, etc..
}
}
}

我已阅读 java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html 并且我认为这种用法是安全的,因为我通过同步控制抛出 ThreadDeath 的位置并处理它和唯一损坏的对象可能是我的 Pattern 和 Matcher 实例,它们无论如何都会被丢弃。我认为这会破坏 Thread.stop() 因为我没有重新抛出错误,但我真的不希望线程死掉,只是中止 find() 方法。

到目前为止,我已经设法避免使用这些已弃用的 API 组件,但 Matcher.find() 似乎不是可中断的,并且可能需要很长时间才能返回。有没有更好的方法来做到这一点?

最佳答案

来自 Heritrix:( crawler.archive.org )

/**
* CharSequence that noticed thread interrupts -- as might be necessary
* to recover from a loose regex on unexpected challenging input.
*
* @author gojomo
*/
public class InterruptibleCharSequence implements CharSequence {
CharSequence inner;
// public long counter = 0;

public InterruptibleCharSequence(CharSequence inner) {
super();
this.inner = inner;
}

public char charAt(int index) {
if (Thread.interrupted()) { // clears flag if set
throw new RuntimeException(new InterruptedException());
}
// counter++;
return inner.charAt(index);
}

public int length() {
return inner.length();
}

public CharSequence subSequence(int start, int end) {
return new InterruptibleCharSequence(inner.subSequence(start, end));
}

@Override
public String toString() {
return inner.toString();
}
}

用这个包裹你的 CharSequence,线程中断将起作用......

关于java - 取消长时间运行的正则表达式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/910740/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com