Frage zu Threads

  • Themenstarter Themenstarter mrmiagi
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
M

mrmiagi

Gast
Hallo, ich programmiere Gerade an einem Crawler und hoffe mir kann jemand helfen.
Für jeden Crawlprozess soll es einen Thread geben der sich eine gemeinsame Liste der Seiten teilt.


Code zum starten des Thread
Code:
package client;

public class Crawler {
	
	public Crawler(String url)
	{
		CrawlerList cl = new CrawlerList();
		CrawlerListItem it = new CrawlerListItem(false, url);	
		CrawlerThread main = new CrawlerThread(it);
		CrawlerThread.setCrawlerlist(cl);
		main.start();
		CrawlerThread.getCrawlerlist().print();
		
	}
}

Der Thread
Code:
package client;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
import java.util.Vector;

public class CrawlerThread extends Thread{
	
	private static CrawlerList crawlerlist;
	private static int Instances = 0;
	
	private CrawlerListItem it;
	
	public CrawlerThread(CrawlerListItem it)
	{
		this.it = it;
	}
	
	public void run()
	{
		Instances++;
		
		HTMLPage cursite = null;
		//Seite crawlen
		try {
			cursite = new HTMLPage(new URL(it.getUrl()));
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		//Aus jedem extrahierten Link ein CrawlerListItem machen und zur CrawlerList hinzufügen
		Vector<String> internalLinks = cursite.getInternalLinks();
		
		for(Enumeration el = internalLinks.elements(); el.hasMoreElements();)
		{
			String cururl = (String) el.nextElement();
			crawlerlist.addItem(new CrawlerListItem(false, cururl));
		}
		//Seite als gecrawled marken	
		Instances--;
	}

	public static CrawlerList getCrawlerlist() {
		return crawlerlist;
	}

	public static void setCrawlerlist(CrawlerList crawlerlist) {
		CrawlerThread.crawlerlist = crawlerlist;
	}

}

Doch ich habe dann nachher keinen Zugriff mehr auf die Crawlerlist

Code:
CrawlerThread.getCrawlerlist().print();

bringt kein ergebniss, wenn ich aber im Thread darauf zu greife geht das.
Warum funktioniert das nicht? ich dachte mir ich übergebe ja eine referenz und bekomme die dann zurück.

Wäre für hilfe sehr dankbar.
 
kann ja nich klappen, wenn du statisch darauf zugreifst. mach den static kram weg und ruf dann die methode des objekts auf

Code:
main.getCrawlerList().print();
 
Nee das geht auch nicht, ich vermute deshalb weil die Variablen nach dem Ende von run() nicht mehr existiert. Ich dachte halt es muss static sein, damit alle Threads mit der gleichen Liste arbeiten.
 
Also, ich weis woran es liegt, der CrawThread hatte den Crawlprozess noch nicht abgeschlossen als ich print aufgerufen habe.

Ich habe jetzt erstmal was so gebastelt das ich im Thread nen bool wert habe der nach dem Crawlen auf true gesetzt wird und diesen dann Abfrage. Vielleicht hat ja jemand noch nen eleganteren Vorschlag. Ich poste mal den Sourcecode:

Code:
package client;

import java.util.Timer;

public class Crawler{
	
	public Crawler(String url)
	{
		CrawlerList cl = new CrawlerList();
		CrawlerListItem it = new CrawlerListItem(false, url);	
		CrawlerThread main = new CrawlerThread(it);

		main.setCrawlerlist(cl);
		main.start();

		while(!main.isCrawldone())
		{}
		
		main.getCrawlerlist().print();		
	}
}

Und hier noch der Thread Sourcecode
Code:
package client;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
import java.util.Vector;

public class CrawlerThread extends Thread{
	
	protected CrawlerList crawlerlist;
	private boolean crawldone = false;
	private static int Instances = 0;
	
	private CrawlerListItem it;
	
	public CrawlerThread(CrawlerListItem it)
	{
		this.it = it;
	}
	
	public void run()
	{
		Instances++;
		
		HTMLPage cursite = null;
		//Seite crawlen
		try {
			cursite = new HTMLPage(new URL(it.getUrl()));
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		//Aus jedem extrahierten Link ein CrawlerListItem machen und zur CrawlerList hinzufügen
		Vector<String> internalLinks = cursite.getInternalLinks();
		
		for(Enumeration el = internalLinks.elements(); el.hasMoreElements();)
		{
			String cururl = (String) el.nextElement();
			crawlerlist.addItem(new CrawlerListItem(false, cururl));
		}
		//Seite als gecrawled marken	
		
		crawldone = true;
		Instances--;
	}

	public CrawlerList getCrawlerlist() {	
		return crawlerlist;
	}

	public void setCrawlerlist(CrawlerList crawlerlist) {
		this.crawlerlist = crawlerlist;
	}

	public boolean isCrawldone() {
		return crawldone;
	}
}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben