2017-10-29 4 views
-4

Warum wird mein Boolean nicht korrekt aktualisiert?Java - Boolean wird nicht richtig aktualisiert

public class Declarations { 

    public static List<Future<?>> futures = new ArrayList<>(); //it is filled by FutureTasks (about 10) 
    public static Boolean ready = true; 

} 

private class Stop { 

    private void stop() { 
     Declarations.ready = false; 
     for(Future<?> f : futures) { 
      f.cancel(true); 
     } 
    } 

} 

private class FutureTask implements Runnable { 

    @Override 
    public void run() { 
     try { 
      (...) 
     } catch (Exception ex) { 
      if(ready) { 
       System.out.println("Exception!"); 
      } 
     } 
    } 

} 

Wenn ich laufen stop() von Stop-Klasse bekam ich "Exception" in der Ausgabe. WARUM? Ich ändere den booleschen Wert, also was ist hier los?

+3

1. Bitte erstellen und veröffentlichen Sie einen gültigen [mcve], Code, den wir kompilieren und testen können. 2. Sollte nicht bereit sein, als "flüchtig" gekennzeichnet zu werden? –

+0

Ich habe Variable volatile gemacht und bin mir sicher, dass Declarations.ready = false; Wird ausgeführt –

+0

Und noch haben Sie noch nicht veröffentlicht Ihre MCVE, also wenn dies Ihr Problem nicht gelöst hat, machen Sie es schwierig, wenn nicht unmöglich für uns, Ihnen zu helfen, oder für Ihre Frage zukünftigen Besuchern mit ähnlichen Problemen zu helfen . –

Antwort

3

Sie haben keine Synchronisierung und Ihr ready ist nicht flüchtig, so Änderungen vorgenommen, um es in einem Thread nicht einmal jemals sichtbar von anderen Threads sein garantiert.

Versuchen Sie es volatile machen.

Dokumentation über Synchronisation: https://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.1

+0

Geändert und es ist immer noch das gleiche –

0

Sie haben den gesamten Code nicht zur Verfügung stellen, so dass es schwer zu verstehen ist, was los ist.

Ich schlage vor, Sie debuggen Sie Ihren Code oder fügen Sie einen Ausdruck nach "Declarations.ready = false;" zu verstehen, ob es ausgeführt wird oder nicht.

Es ist auch unklar, ob es auf einem einzelnen Thread oder parallel in mehreren Threads ausgeführt wird.

+0

Ich habe System hinzugefügt .out.println (bereit); direkt bevor es falsch gemacht wird und es immer noch dasselbe ist. Ich meine, fertig ist gedruckt –

Verwandte Themen