В Java поток висит в SocketRead0, что я могу сделать? - PullRequest
4 голосов
/ 02 июля 2011

Я занимаюсь разработкой веб-сканера, но часто после непродолжительного выполнения (минут) некоторые потоки перестают выполнять свою работу. Запустив отладчик, я обнаружил, что он останавливается в SocketRead0.

Это происходит, когда поток загружает содержимое страницы с HttpURLConnection.getInputStream().

Я не знаю, что вызывает это, но я думаю, что это связано с многопоточностью.

Кто-то знает, как решить или избежать этого?

Я не использую пул HttpURLConnection, но я не знаю, как это сделать.

conn = (HttpURLConnection) new URL(url).openConnection();
conn.setInstanceFollowRedirects(true);
conn.connect();
CountingInputStream content;

try {
    content = new CountingInputStream(conn.getInputStream());
    //processing of content
    content.close();
    return true;
    } catch (Exception e) {
        return false;
    }

Ответы [ 2 ]

4 голосов
/ 02 июля 2011

Необходимо установить время ожидания чтения сокета для соединения. Это заставит его генерировать исключение вместо зависания после указанного периода времени.

http://download.oracle.com/javase/1.5.0/docs/api/java/net/URLConnection.html#setReadTimeout(int)

3 голосов
/ 02 июля 2011

Сервер, который вы используете, вероятно, не отправляет данные, когда вы этого ожидаете, и ваш поток находится в ожидании данных.

Исходные классы java.io.*, которые вы используете, являются блокирующими реализациями ввода / вывода, что означает, что такие методы, как InputStream.read(), остановят поток, если данные для чтения недоступны - вызов ожидает есть данные, и если они приходят, метод возвращает.

В Java 1.4 был добавлен пакет java.nio, который представляет собой неблокирующую реализацию I / O. Я рекомендую использовать это, если вы используете сервер, который может работать ненадежно. Вот несколько примеров того, как использовать nio.

...