Вероятно, было бы легче просто использовать Для цикла вместо ForEach. Но, точно так же Вы могли сохранить счетчик в своем Цикле foreach и видеть, если его равное yourCollection.Count - 1
, то Вы находитесь в последнем повторении.
То, что вы сделали, мне нравится, вот как я измените его:
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();
Я могу ошибаться здесь, но я думаю, что все способы завершить поток уже давно устарели . Рекомендуемый способ - использовать общую переменную isRunning
, которую ваш рабочий поток периодически проверяет и корректно завершает, когда она установлена.
Это не сработает в вашем случае, но мне кажется, что вы лечение симптома - не настоящая проблема. Вы должны опубликовать код своей функции регулярного выражения, выполнение которой занимает 6 секунд. Если это само регулярное выражение,
Есть два способа ответить на этот вопрос.
С одной стороны, не существует известного практического / эффективного способа, который, как известно, был бы безопасным для остановки выполняемого потока Matcher.find (...)
или Matcher.match (...)
. Вызов Thread.stop ()
будет работать, но есть серьезные проблемы с безопасностью. Единственный способ решить эту проблему - разработать собственный механизм регулярных выражений, который регулярно проверял бы флаг прерванный
. (Это не совсем непрактично. Например, если GPL не проблема для вас, вы можете начать с существующего механизма регулярных выражений в OpenJDK.)
С другой стороны, настоящий корень вашей проблемы (скорее всего, ), что вы неправильно используете регулярные выражения. Либо вы пытаетесь сделать что-то слишком сложное для одного регулярного выражения, или ваше регулярное выражение неоптимально.
РЕДАКТИРОВАТЬ : Типичная причина того, что регулярные выражения занимают слишком много времени, - это множественные кванторы (?, , +), вызывающие патологический возврат. Например, если вы попытаетесь сопоставить строку из N символов «A», за которой следует «B», с регулярным выражением «^ A A A A A A $» , сложность вычисления (не менее) O (N ** 5). Вот более «реальный» пример:
"(.*)<html>(.*)<head>(.*)</head>(.*)<body>(.*)</body>(.*)</html>(.*)"
А теперь представьте, что произойдет, если вы встретите такую «веб-страницу»:
<html><html><html><html><html><html><html><html><html><html>
<head><head><head><head><head><head><head><head><head><head>
</head></head></head></head></head></head></head></head></head></head>
<body><body><body><body><body><body><body><body><body><body><body>
</body></body></body></body></body></body></body></body></body></body>
Обратите внимание на отсутствие закрывающего тега