Должен быть пограничный объект - удерживающий набор посещенных и ожидающий сканирования URL-адресов.
Должна быть какая-то тема, отвечающая за сканирование веб-страниц.
Также будет какой-то объект контроллера для создания потоков сканирования.
Я не знаю, какая архитектура будет быстрее, проще расширять. Как разделить обязанности, чтобы сделать как можно меньше синхронизации, а также минимизировать количество проверок, если текущий URL уже посещен.
Если объект контроллера отвечает за предоставление новых URL-адресов рабочим потокам - это означает, что рабочие потоки должны будут сканировать все заданные URL-адреса и затем спать в течение неопределенного времени. Контроллер будет интерпретировать эти потоки, поэтому обходящий поток должен обрабатывать InterruptedException
(насколько это дорого в Java - кажется, что обработка исключений не очень быстрая).
Или, может быть, контроллер должен только запускать потоки и позволять сканирующим потокам самим выбирать границы?