Threads Gibt es eine Möglichkeit des Nichtblokierens?

gurkensalat

Mitglied
Hallo,

ich habe zwei Objekte, wovon eines von Thread ableitet welches ich im folgenden ThreadObject nenne. Threadobject hat neben der Methode run() auch noch eine Methode isDone() die mir ein Boolean zurückgibt, ob die run-Methode fertig ist. Dafür setzt die run Methode am Ende eine Booleanvariable auf true.
Das erste Objekt initialisiert das ThreadObject und startet die run-Methode mit start(). Alle paar Sekunden fragt es nun die isDone()-Methode ab, um zu erfahren, ob ThreadObject fertig ist.
Allerdings blockiert die isDone()-Methode, solange bis ThreadObject mit run() fertig ist. Nun frage ich mich, ob es eine Möglichkeit gibt, isDone() kontinuierlich abzufragen...

Eine weitere Frage noch: Wenn ThreadObject mit run() fertig ist, kann ich dann erneut mit start() die run()-Methode starten?

Falls euch die Vorstellung der Problemstellung nicht so leicht fällt (ist ja nur Text), könnt ihr hier nochmal kurz auf den Quelltext schauen:

Java:
public class ThreadObject extends Thread{
    private boolean done = true;

    public boolean isDone(){ return done;}

    public void run(){
        done = false;
        //Do things
        done = true;
    }
}

public class FirstObject{
    public void anyMethod(){
        ThreadObject to = new ThreadObject();
        to.start();
        while(!to.isDone()){
            try {
	        Thread.sleep(1000);
	    } catch (InterruptedException e) {
	        e.printStackTrace();
	    }
        }

        to.start(); //<-- ist das hier möglich?
    }
}
 
Schleife funktioniert, solltest vielleicht nicht mit true anfangen in der Variablen..,
falls abgefragt wird bevor run() auf false setzt, ist ja schließlich nebenläufig, niemand kann sagen wann run() drankommt,
zumindest auf paar ms bezogen

Neustart geht nicht, dafür müsstest du einen Thread laufen lassen und intern Pause/ Wiederholung steuern

Java:
public class Test
{
    public static void main(String[] args)
        throws Exception
    {
        new FirstObject().anyMethod();
    }

}


class ThreadObject
    extends Thread
{
    private boolean done = false;

    public boolean isDone()
    {
        return done;
    }

    public void run()
    {
        done = false;
        try
        {
            Thread.sleep(4000);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        done = true;
    }
}


class FirstObject
{
    public void anyMethod()
    {
        ThreadObject to = new ThreadObject();
        to.start();
        while (!to.isDone())
        {
            System.out.println("warte auf done");
            try
            {
                Thread.sleep(1000);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
        System.out.println("fertig");
    }
}
 
die run-Methode besteht aus einer Schleife, darin wird entweder die Untermethode mit der Arbeit aufgerufen oder
gewartet, entweder mit sleep konstante Zeiten, je kürzer desto eher wird auf interne Kommandos reagiert, die natürlich abgefragt werden müssen, oder mit wait/notify exakt warten
 
Eine weitere Frage noch: Wenn ThreadObject mit run() fertig ist, kann ich dann erneut mit start() die run()-Methode starten?
simple antwort: nein da das Thread objekt sich merkt ob schonmal gestartet wurde und eine erneute ausfuehrung unterbindet.
wenn du das selbe nochmal starten willst musst du zb ein neues Objekt deiner ThreadKlasse erstellen und das laufen lassen
 

Zurück
Oben