2016-07-13 9 views
1

Ich lese das Buch mit dem Namen Wirksame Java 2 in Element 66, es heißt, dass der Hintergrund Thread für immer laufen und nie aufhören wird. Aber wenn ich den Code in meinem Computer starte, hört es in einer Sekunde auf? Was ist los mit dir? ist es das Computer-Cache-Problem?Warum sollte ein Hintergrund-Thread ausgeführt und dann in einer Sekunde gestoppt werden? Sollte es für immer ausgeführt werden?

public class StopThread { 
    private static boolean stopRequested; 

    public static void main(String[] args) 
     throws InterruptedException { 
    Thread backgroundThread = new Thread(new Runnable() { 
     public void run() { 
     int i = 0; 
     while (!stopRequested) { 
      i++; 
      System.out.println(i+";"); 
     } 
     } 
    }); 
    backgroundThread.start(); 
    TimeUnit.SECONDS.sleep(1); 
    stopRequested = true; 
    } 
} 

Die Bücher vorschlagen Synchronize oder volatile zu verwenden, aber ich versuche, und feststellen, dass auch ich nicht den Vorschlag nicht verwenden, es läuft in einem zweiten in meinem Computer. Aber renne für immer in meinem Mitbewohner. Er sagt, dass dies der Grund für die Cache-Konfiguration ist.

Kann mir jemand den Grund sagen?

+3

Uhh, aber Sie stoppen den Thread nach einer Sekunde? 'while (! stopRequested)' läuft bis 'stopRequested = true;' was nach 'TimeUnit.SECONDS.sleep (1);' geschieht - warten Sie 1 Sekunde und stoppen dann den Thread. – TessellatingHeckler

+1

.......... ernsthaft –

+0

@ TessellatingHeckler, ich halte den Faden nicht auf.Es stoppt automatisch. – flower

Antwort

4

Was Bloch, Autor von Effective Java, sagt, ist "in Abwesenheit der Synchronisation, gibt es keine Garantie, wann, wenn überhaupt, wird der Hintergrund-Thread die Änderung im Wert sehen-Requested [SIC] ".

Das heißt, es kann sofort aufhören. Oder es könnte nach kurzer Zeit aufhören. Oder es könnte nie aufhören. Es ist nicht erforderlich für immer laufen. In diesem Fall muss der Compiler nicht einmal die Synchronisation entfernen. Aber es kann. Und es könnte sehr gut. Und so können Sie das ist, wo „flüchtig“ Stichwort kommt

0

Sie haben eine Linie zu dem ursprünglichen Beispiel hinzugefügt:.

System.out.println(i+";"); 

PrintStream.println(String) enthält einen synchronized Block, die ähnlichen Speicherkonsistenzeffekte volatile hat.

+0

nein, nicht wirklich. Es wird nicht synchronisiert, da nur ein Thread nach STDOUT druckt. – glee8e

+1

@ glee8e Nun, es zwingt definitiv eine Lesebarriere auf den Hintergrund Thread. Der Schreibvorgang wird wahrscheinlich gelöscht, wenn der Haupt-Thread endet. – shmosel

+0

@ glee8e Die 'println()' ist in der Tat die Änderung, die diese "Arbeit" macht. Das Fehlen von garantiertem Verhalten garantiert nicht das Fehlen von Verhalten im Rahmen des JMM. – erickson