Проблема, с которой я столкнулся на самом деле, заключается в том, что я хочу собирать данные из многих URL-адресов, и из-за того факта, что я могу получить только следующий URL-адрес, который мне нужно проанализировать, путем синтаксического разбора актуального, а проблема заключается в том, чтовремени ответа сервера, если запрос не был отправлен одновременно, это заняло бы слишком много времени, я решил использовать рекурсивную структуру FixedThreadPool с использованием Jsoup.
Но похоже, что чем больше потоков запущено,чем больше ошибок делает программа, и я не могу найти проблему.
import java.io.IOException;
import java.util.Vector;
import java.util.concurrent.Callable;
import java.util.concurrent.Semaphore;
import java.util.concurrent.ThreadPoolExecutor;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class MyCallable implements Callable
{
private final Tree ak;
private final ThreadPoolExecutor executor;
private final Node root;
private long id;
public MyCallable(Node Root, Tree aka, ThreadPoolExecutor tpe)
{
this.ak = aka;
this.executor = tpe;
this.root = Root;
}
@Override
public Object call() throws Exception, IOException {
Document doc = Jsoup.connect(this.root.getLink()).get();
Elements links = doc.select("a[href]");
int i = 0;
for (Element link : links) {
String adresse = link.attr("abs:href");
if(adresse.contains("/keyword/"){
Node neu = this.ak.addifnotexists(link.text(),adresse, this.id ,root , false);
if (neu != null){
i++;
this.executor.submit(new MyCallable(neu,this.ak,this.executor));
}
}
}
throw new UnsupportedOperationException("Not supported yet.");
}
}
РЕДАКТИРОВАТЬ: @ akshaya pandey
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Vector;
public class Tree
{
Vector<Node> allNodes = new Vector<Node> (25000, 1000);
public synchronized Node addifnotexists(String Kategoriename, String Link, long id, Node Root, boolean first) throws InterruptedException{
boolean existsalready = false;
if (!first){
existsalready = doesexist(Kategoriename, Link);
}
if (!existsalready){
allNodes.add(new Node(Kategoriename, Link, id, Root, new String[10][101], first));
}
if (existsalready) {
return null;
}
System.out.println(allNodes.size());
return allNodes.get(allNodes.size()-1);
}
private synchronized boolean doesexist (String kategorie, String lilink) {
int start = 0;
int end = 0;
int j = 0;
int i = 0;
String Kat;
char[] Kate;
for (Node node : allNodes){
if (node.getKategorie().equals(kategorie)){
Kat = node.getLink();
Kate = Kat.toCharArray();
for (char bstb : Kate){
if (bstb == ('/')){
i++;
if (i == 5){
start = j;
}
if (i == 6){
end = j;
}
}
j++;
}
Kat = Kat.substring(Math.abs(start), Math.abs(end+1));
Kate = lilink.toCharArray();
i = 0;
j = 0;
for (char bstb : Kate){
if (bstb == ('/')){
i++;
if (i == 5){
start = j;
}
if (i == 6){
end = j;
}
}
j++;
}
String linkvergleich = lilink.substring(Math.abs(start), Math.abs(end+1));
if(linkvergleich.equals(Kat)){
return true;
}
}
}
return false;
}
}
import java.util.ArrayList;
import java.io.*;
public class Node implements Serializable
{
private final Node root;
private final String kategorie;
private final String link;
private final String[][] bestsellerliste;
private final long ID;
private ArrayList <Node> naechster = new ArrayList <Node>();
public Node(String Kategoriename, String Link, long id, Node Root , String[][] Produktliste, boolean erster)
{
this.root = Root;
this.kategorie = Kategoriename;
this.link = Link;
this.bestsellerliste = Produktliste;
if (!erster){
this.root.setNaechster(this);
}
this.ID = id;
//System.out.println(Kategoriename);
}
public synchronized Node getRoot()
{
return this.root;
}
public synchronized String getKategorie()
{
return this.kategorie;
}
public synchronized String getLink()
{
return this.link;
}
public synchronized String[][] getBestsellerliste()
{
return this.bestsellerliste;
}
public synchronized void setNaechster(Node next){
naechster.add(next);
}
public synchronized void deleteNaechster(Node next){
naechster.remove(next);
}
public synchronized ArrayList <Node> getNaechster(){
return this.naechster;
}
public synchronized long getID(){
return this.ID;
}
}