Содержание
- Многопоточные коллекции
- Блокирующиеся очереди
- Многопоточные отображения
- Самокопирующиеся коллекции
- Управление заданиями
- Исполнители
- Функции и результаты
- Отложенное исполнение
- Прочие возможности
- Интервалы времени
- Очереди с задержкой
Домашнее задание 9. Web Crawler
-
Напишите потокобезопасный класс
WebCrawler
, который будет рекурсивно обходить сайты.-
Класс
WebCrawler
должен иметь конструкторpublic WebCrawler(Downloader downloader, int downloaders, int extractors, int perHost)
downloader
позволяет скачивать страницы и извлекать из них ссылки;downloaders
— максимальное число одновременно загружаемых страниц;extractors
— максимальное число страниц, из которых одновременно извлекаются ссылки;perHost
— максимальное число страниц, одновременно загружаемых c одного хоста. Для определения хоста следует использовать методgetHost
классаURLUtils
из тестов.
-
Класс
WebCrawler
должен реализовывать интерфейсCrawler
public interface Crawler extends AutoCloseable { Result download(String url, int depth); void close(); }
-
Метод
download
должен рекурсивно обходить страницы, начиная с указанного URL, на указанную глубину и возвращать список загруженных страниц и файлов. Например, если глубина равна 1, то должна быть загружена только указанная страница. Если глубина равна 2, то указанная страница и те страницы и файлы, на которые она ссылается, и так далее. -
Метод
download
может вызываться параллельно в нескольких потоках. - Загрузка и обработка страниц (извлечение ссылок) должна выполняться максимально параллельно, с учетом ограничений на число одновременно загружаемых страниц (в том числе с одного хоста) и страниц, с которых загружаются ссылки.
-
Для распараллеливания разрешается создать
до
downloaders + extractors
вспомогательных потоков. -
Повторно загружать и/или извлекать ссылки из одной
и той же страницы в рамках одного обхода
(
download
) запрещается. -
Метод
close
должен завершать все вспомогательные потоки.
-
Метод
-
Для загрузки страниц должен применяться
Downloader
, передаваемый первым аргументом конструктора.public interface Downloader { public Document download(final String url) throws IOException; }
-
Метод
download
загружает документ по его адресу (URL). -
Документ позволяет получить ссылки по загруженной странице:
public interface Document { List<String> extractLinks() throws IOException; }
Ссылки, возвращаемые документом, являются абсолютными и имеют схемуhttp
илиhttps
.
-
Метод
-
Должен быть реализован метод
main
, позволяющий запустить обход из командной строки-
Командная строка
WebCrawler url [depth [downloads [extractors [perHost]]]]
-
Для загрузки страниц требуется использовать реализацию
CachingDownloader
из тестов.
-
Командная строка
-
Класс
-
Версии задания
- Простая — не требуется учитывать ограничения
на число одновременных закачек с одного хоста
(
perHost >= downloaders
). - Полная — требуется учитывать все ограничения.
- Бонусная — сделать параллельный обход в ширину.
- Простая — не требуется учитывать ограничения
на число одновременных закачек с одного хоста
(
- Задание подразумевает активное использование Concurrency Utilities, в частности, в решении не должно быть «велосипедов», аналогичных/легко сводящихся к классам из Concurrency Utilities.
Библиография
- JSR 166: Concurrency Utilities
- Concurrent Programming with J2SE 5.0
- Getting to know synchronizers
- Эндрюс Г. Основы многопоточного, параллельного и распределенного программирования
- Goetz B. Java concurrency in practice