/
Nicholas
/
java_basics
Обзор
Документация
Войти
/
Nicholas
/
java_basics
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
Multithreading/SiteMap/src/main/java/LinkGrabber.java
53 строки
2 KB
Nicholay Sokolovsky
19.3 ForkJoinPool
09 дек 2023, 01:36
09 дек 2023, 01:36
71d7966
Код
Авторство
О чём код?
import java.util.ArrayList; import java.util.List; import java.util.TreeSet; import java.util.concurrent.RecursiveAction; import org.jsoup.Connection; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; public class LinkGrabber extends RecursiveAction { private String url; private TreeSet<String> links; public LinkGrabber(String url, TreeSet<String> links) { this.url = url; this.links = links; } protected void compute() { try { String tabStr = "\t"; Connection connection = Jsoup.connect(this.url); Thread.sleep(150); Document doc = connection.get(); Elements elements = doc.select("a"); List<LinkGrabber> taskList = new ArrayList<>(); for (Element element : elements) { String link = element.attr("abs:href").replaceFirst("/$", ""); // Откусываем слэш в конце для единообразия if (link.startsWith(url) && link.indexOf('#') < 0) { // Ссыока из той же ветки и не ссылается на саму себя synchronized (links) { if (links.add(tabStr.repeat((int) link.chars().filter(c -> c == '/').count() - 2).concat(link).concat("\n"))) { //Кладём строки с табуляциями и переносом в конце строки LinkGrabber task = new LinkGrabber(link, links); task.fork(); taskList.add(task); } } } } for (LinkGrabber task : taskList) { task.join(); } } catch ( Exception e) { e.printStackTrace(); } } }