Servus,
habe ein kleines Problem mit Threads. Und zwar will ich einen Thread starten, dann später irgendwann abbrechen und im Main-Thread aber solange warten, bis er tatsächlich fertig ist.
Mein erster Ansatz war folgendermaßen:
Leider mußte ich dann feststellen, daß ein Aufruf der Methode "cancel" vom Main-Thread aus irgendwie nicht im Main-Thread ausgeführt wird - zumindest wird finished niemals auf true gesetzt, weil die while-Schleife in der cancel-Methode für immer blockiert.
Ein nächster Versuch war, statt "extends Thread" ein "implements Runnable" draus zu machen, und dies dann einem separaten Thread-Konstruktor zu übergeben. Aber auch da lief es haargenau gleich ab.
Mein dritter Versuch war nun, direkt im Main-Thread zu warten, also die cancel-Methode des Test-Threads wurde auf ein einfaches "running = false" reduziert, und im Main-Thread kam die folgende Methode dazu:
Aber auch diese Schleife blockierte (egal, wie lang man gewartet hat, habe auch mal Konsolenausgaben eingefügt um das besser kontrollieren zu können), und das verstehe ich absolut nicht. Der Main-Thread läuft doch parallel zum Test-Thread ab?! Da kann doch die eine Methode niemals den anderen Thread blockieren...
Also wie gesagt, das geht über meine Vorstellungskraft hinaus. Daher meine Fragen: 1) Woran liegt das, daß die Methode dennoch blockiert, und 2) Was gibt es für eine bessere / richtige Möglichkeit für das Problem?
habe ein kleines Problem mit Threads. Und zwar will ich einen Thread starten, dann später irgendwann abbrechen und im Main-Thread aber solange warten, bis er tatsächlich fertig ist.
Mein erster Ansatz war folgendermaßen:
Code:
public class Test extends Thread
{
public boolean finished;
public boolean running;
public void run()
{
running = true;
finished = false;
while(running)
{
// blablabla
// ...
}
finished = true;
}
public void cancel()
{
running = false;
while(! finished);
}
}
Leider mußte ich dann feststellen, daß ein Aufruf der Methode "cancel" vom Main-Thread aus irgendwie nicht im Main-Thread ausgeführt wird - zumindest wird finished niemals auf true gesetzt, weil die while-Schleife in der cancel-Methode für immer blockiert.
Ein nächster Versuch war, statt "extends Thread" ein "implements Runnable" draus zu machen, und dies dann einem separaten Thread-Konstruktor zu übergeben. Aber auch da lief es haargenau gleich ab.
Mein dritter Versuch war nun, direkt im Main-Thread zu warten, also die cancel-Methode des Test-Threads wurde auf ein einfaches "running = false" reduziert, und im Main-Thread kam die folgende Methode dazu:
Code:
public void cancelAndWait(Test t)
{
t.cancel();
while(! t.finished);
}
Aber auch diese Schleife blockierte (egal, wie lang man gewartet hat, habe auch mal Konsolenausgaben eingefügt um das besser kontrollieren zu können), und das verstehe ich absolut nicht. Der Main-Thread läuft doch parallel zum Test-Thread ab?! Da kann doch die eine Methode niemals den anderen Thread blockieren...
Also wie gesagt, das geht über meine Vorstellungskraft hinaus. Daher meine Fragen: 1) Woran liegt das, daß die Methode dennoch blockiert, und 2) Was gibt es für eine bessere / richtige Möglichkeit für das Problem?