Wie stoppe ich diesen Thread

smarterToby

Neues Mitglied
Hallo zusammen, wenn ich meinen Thread starte soll er entweder 5 mal durchlaufen oder der Boolean exit beendet es davor. Aber wenn ich die Methode setExit(true) aufrufe, beendet dies nicht die while Schleife.
Wie geht das? Ich möchte sozusagen den Thread stoppen, wenn man das so sagen kann

Java:
public class MyThread implements Callable<Boolean> {

    private boolean exit;

    public Boolean call() {
        int i = 0;
        while (!exit && i!=5) {
            i++;
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                System.out.println("Caught:" + e);
            }
        }

        return true;
    }

    // for stopping the thread
    public void setExit(boolean x) {
        this.exit = x;
    }
}
 
Dein Callable ist auch kein Thread. Er wird im Kontext eines Threads ausgeführt, also z.B. in einem ExecutorService.
Du solltest das exit Feld auch entweder als volatile markieren oder einfach einen AtomicBoolean verwenden.
Du kannst also nicht auf den Thread direkt zugreifen, der deinen Callable ausführt, es sei denn natürlich, du "merkst" dir den ausführenden Thread mit Thread.currentThread() und setzt den in ein neues Feld wenn deine call() Methode aufgerufen wird. Das ist aber ziemlich hässlich.
 
Willkommen in der Welt von Threads!

Das Problem welches du haben wirst, ist der Thread-lokale Cache von Variablen. Ich hatte mal vor laengerem genau so ein Beispiel gebaut, natuerlich zusammen mit einer Loesungbeschreibung. Also was passiert ist dass es einen Cache fuer Variablen gibt pro Thread. Dieser wird nicht immer verworfen wenn wir uns das vorstellen, um ehrlich zu sein kenne ich aber auch die genaue Mechanik dahinter nicht.

Punkt ist: Entweder du synchronisierst den Zugriff exit, oder du machst es volatile wodurch fuer diese Variable kein lokaler Cache verwendet wird.
 

Neue Themen


Zurück
Oben