Как сделать функцию "timeoutable" в Java? - PullRequest
3 голосов
/ 09 октября 2009
private String indexPage(URL currentPage) throws IOException {
    String content = "";
    is = currentPage.openStream();
    content = new Scanner( is ).useDelimiter( "\\Z" ).next();
    return content;
}

Это моя функция, с которой я в настоящее время сканирую веб-страницы. Функция, которая является проблемой:

content = new Scanner( is ).useDelimiter( "\\Z" ).next();

Если веб-страница не отвечает или занимает много времени, моя ветка просто висит над строкой выше. Какой самый простой способ прервать эту функцию, если для полной загрузки этого потока требуется более 5 секунд?

Заранее спасибо!

Ответы [ 5 ]

7 голосов
/ 09 октября 2009

Вместо того, чтобы бороться с отдельным потоком-наблюдателем, вам может быть достаточно (хотя и не совсем соответствует вашему требованию), если вы включите тайм-ауты подключения и чтения в сетевом подключении, например ::

URL url = new URL("...");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setReadTimeout(10000);
InputStream is = conn.getInputStream();

В этом примере произойдет сбой, если для подключения к серверу требуется более 5 секунд (5000 мс) или если вам придется ждать более 10 секунд (10000 мс) между любыми фрагментами содержимого, которые фактически читаются. Тем не менее, он не ограничивает общее время, необходимое для извлечения страницы.

3 голосов
/ 09 октября 2009

Недавно выпущенные Google библиотеки guava имеют некоторые классы, которые предлагают аналогичные функции:

TimeLimiter :

Создает прокси, которые навязываютограничение по времени на вызовы методов для объекта прокси.Например, чтобы вернуть значение target.someMethod (), но заменить DEFAULT_VALUE, если этот вызов метода занимает более 50 мс, вы можете использовать этот код ...

3 голосов
/ 09 октября 2009

Вы можете закрыть поток из другого потока.

1 голос
/ 09 октября 2009

Посмотрите на FutureTask ...

0 голосов
/ 09 октября 2009

Попробуйте прервать поток; многие вызовы блокировки в Java будут продолжаться при получении прерывания.

В этом случае content должно быть пустым, а Thread.isInterrupted() должно быть true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...