2012-03-30 6 views
0

Ich habe zwei Klassen in Java, die zur gleichen Zeit ausgeführt werden müssen - Eine Crawler-Klasse (die im Grunde einen Web-Crawler implementiert und URLs beim Auftreten ausdruckt) und eine Indexer-Klasse. was ab sofort soll einfach die urls gecrawlt werden.Java - Aktualisieren statischer Variablen

Dafür hat meine Indexer Klasse Queue:

public static Queue<String> urls = new LinkedList(); 

Und in der toVisit() Funktion meiner Crawler Klasse, ich habe folgendes:

Indexer.urls.add(url) // where url is a String 

Der Crawler arbeitet völlig gut, da es alle gefundenen URLs ausgibt, aber aus irgendeinem Grund werden diese URLs nicht zur Warteschlange in meiner Indexer-Klasse hinzugefügt. Irgendeine Idee, warum das der Fall sein könnte?

Die toVisit() -Methode von Crawler.java ist wie folgt:

public void visit(Page page) { 
      int docid = page.getWebURL().getDocid(); 
      String url = page.getWebURL().getURL(); 
      String domain = page.getWebURL().getDomain(); 
      String path = page.getWebURL().getPath(); 
      String subDomain = page.getWebURL().getSubDomain(); 
      String parentUrl = page.getWebURL().getParentUrl(); 

      System.out.println("Docid: " + docid); 
      System.out.println("URL: " + url); 
      System.out.println("Domain: '" + domain + "'"); 
      System.out.println("Sub-domain: '" + subDomain + "'"); 
      System.out.println("Path: '" + path + "'"); 
      System.out.println("Parent page: " + parentUrl); 


      Indexer.urls.add(url); 

      System.out.println("============="); 
    } 

-Code aus meiner Indexer Klasse:

public static Queue<String> urls = new LinkedList(); 

public static void main(String[] args) 
{ 
    while(urls.isEmpty()) 
     { 
      //System.out.println("Empty send queue"); 
      Thread.sleep(sleepTime); 
     } 

     System.out.println(urls.poll()); 

} 
+0

Bitte posten Sie die 'toVisit()' Methode – satoshi

+0

laufen Sie zwei Threads dh: 1.Crawler Thread 2.Indexer Thread? – cherit

+0

oder führen Sie den Crawler zufällig in einem Klassenlader und den Indexer in einem anderen? (z. B. zwei verschiedene Web-Anwendungen?) – BigMike

Antwort

0

Okay, so löste ich mein Problem, indem sie, wie durch BigMike vorgeschlagen tun . Ich habe die Runnable-Schnittstelle in meinen zwei Klassen implementiert und dann diese 2 Klassen als Threads innerhalb der Hauptfunktion einer neuen dritten Klasse ausgeführt.

Vielen Dank für Ihre Hilfe! :)