Thread-Ende erkennen [BrettvormKopf.class]

katerTom

Grünschnabel
Hallo,

hänge gerade an einer wahrscheinlich trivialen Geschichte fest.

Dabei geht es um einen Webcrawler, der eine Seite abgrasen soll.
Nun kann es mal passieren, dass mein Parser nichts zu parsen bekommt, deshalb habe ich mir etwas möglichst einfaches überlegt.

Ich skizziere mal kurz den Aufbau:
Klasse A beinhaltet die main-Methode und führt ein paar Aufgaben durch: die letzte davon ist das Crawling!
Ich instanziere also in Klasse A einen Observer-Thread, der selbst die anderen Threads zum Auslesen der Webseite startet. Damit kann ich "zwangsweise" ein Timeout setzen.

Nun möchte ich aber im Anschluss (nach erfolgreichem Abarbeiten des Observer-Threads) in der Klasse A noch einige Dinge erledigen.

Wie kann ich es machen, dass Klasse A erst auf das Ende des Observer-Threads wartet? Ich denke mal, eine Endlos-Schleife à la
while(myObserverThread.isAlive) {;}
kann es nicht sein, oder? :D

Wäre toll, wenn mir jemand ein paar Denkanstöße geben könnte.

Ach so.. ich möchte es vermeiden, dass Klasse A selbst zum Thread gemacht wird.

Danke und viele Grüße
Tom
 
Es gibt für Threads die Methode join(), die darauf wartet das ein Thread beendet wird und bei Beendigung eine Exception (InterruptedException) wirft.
Die Methode müsste dir weiterhelfen, da du damit nicht die ganze Zeit mit isAlive() abprüfen musst ob der Thread noch läuft.

Gruss Ben
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

jo Thread join(); ist das was du brauchst.

Java:
/**
 * 
 */
package de.tutorials;

import java.util.concurrent.TimeUnit;

/**
 * @author Thomas.Darimont
 *
 */
public class ThreadJoinExample {

  /**
   * @param args
   */
  public static void main(String[] args) throws Exception{
    
    Thread thread = new Thread(){
      @Override
      public void run() {
        for(int i = 0; i < 10;i++){
          try {
            System.out.println("Sleep: " + i);
            TimeUnit.SECONDS.sleep(1);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
      }
    };
    
    
    thread.start();
    thread.join();
    
    System.out.println("Finished");
  }

}

Gruß Tom
 
Ja, genauso hab ich es gemacht. Und das Gute daran ist, dass die Klasse selbst nicht von Thread abgeleitet sein muss, um auf das Abarbeiten des instanzierten Threads zu warten.

Ohne gewaltverherrlichend zu wirken, muss ich sagen: das passte bei meinem Problem "wie die Faust auf's Auge" :)
 
Zurück