Verweise auf Variablen in verschiedenen Threads

noveb

Mitglied
Hallo zusammen,

ich habe 3 Klassen A,B,C die Runnable implementieren.
Alle 3 haben eine boolsche Variable die in einer While schleife geprüft wird. Ca so sieht das aus:

Java:
public class A implements Runnable{
private boolean stopThread;
public A(){this.stopThread = false;}
public run(){
threadPool.execute(new B(this.stopThread));
threadPool.execute(new C(this.stopThread));
while(!this.stopThread){
//...
}
//...
}
public class B implements Runnable{
private boolean stopThread;
public B(boolean pStopThread){ this.stopThread = pStopThread;}
public run(){
while(!this.stopThread){
//...
}
//...
}
public class C implements Runnable{
private boolean stopThread;
public C(boolean pStopThread){ this.stopThread = pStopThread;}
public run(){
while(!this.stopThread){
//...
this.stopThread = true;//IN ALLEN 3 THREADS SOLLEN DIE WHILEs STOPPEN
}
//...
}

Ich dachte, die booleans stopThread verweisen alle auf die selbe Adresse im Speicher, so dass sollte irgendwo etwas anderes zugewiesen werden (Z. 27) sich bei den anderen die Werte ebenfalls ändern. Tut es aber anscheinend nicht, liegt das daran, dass das in unterschiedlichen Klassen steht? Oder weil die Threads eigene Speicherstacks haben?
Wie lässt sich so etwas dann aber realisieren?
 
Okay, also das Problem liegt bei dir daran, dass es sich zum einen um primitive Datentypen handelt, weswegen du nicht einfach diesen Wert teilen kannst.
Außerdem hast du hier völlig verschiedene Variablen in unterschiedlichen Klassen, die nichts außer den Namen (der zur Laufzeit eh nicht mehr so existiert) gemeinsam haben.

Zum einlesen:
Galileo Computing :: Java ist auch eine Insel - 3 Klassen und Objekte

Wenn du willst, dass alle drei Klassen auf einen Wert "schauen", dann musst du diesen eine Referenz auf ein gemeinsames Objekt geben.
 
Ich bin der Meinung ich habe das selbe gemacht wie in "3.7.3 Zuweisungen bei Referenzen" aus "Java ist auch eine Insel". Im Konstruktor sage ich ja mehr oder weniger B.stopThread = A.stopThread, die heißen also nicht nur gleich, werden auch referenziert.

Sollte sich mein Problem lösen, indem ich die Wrapper Klasse Boolean benutze? An anderer Stelle habe ich das selbe Problem mit Variablen vom Typ String, was kein primitiver Datentyp ist oder?

EDIT: Hab das nun mit der Wrapper Klasse versucht, wie erwartet funktioniert es nicht.
Sollte es an der Zuweisung liegen, was ist dann der Fehler, bzw die Korrektur?
 
Zuletzt bearbeitet:
Boolean ist immutable. Du kannst einem Boolean nicht sagen, dass er nun false ist und dann true. Dazu wird immer ein neues Wrapper Objekt erstellt.

Daher kannst du sowas:
[JAPI]java.util.concurrent.atomic.AtomicBoolean[/JAPI]
verwenden oder selbst eien Klasse bauen:
Java:
class BooleanContainer
{
  private boolean value;

  public boolean getValue() {return value;}
  public boolean setValue(boolean newValue) {value = newValue;}
}

Dann musst du den Wrapper deiner Wahl nur noch übergeben. Zu empfehlen ist hier wohl AtomicBoolean, da dieser Threadsafe ist.
 

Zurück
Oben