2016-04-19 13 views
0

Frage:Argumentstatus nach Abschluss des Threads

Angenommen, wir übergeben eine ArrayList an den Runnable-Konstruktor. In der Runnable-Klasse fügen wir der Liste bestimmte Zeichenfolgen hinzu. Jetzt führen wir den Thread von main() aus und warten auf seinen Abschluss. Nachdem die Thread-Ausführung beendet ist, ist es möglich, dass wenn wir die Liste in main() iterieren, die Strings (Werte) von der Runnable-Klasse zur Liste hinzugefügt werden, weil der Verweis auf die Arraylist in Heap erstellt wird. aber wenn ich die Liste iteriere, ist es leer. Kann jemand erklären, warum die Liste leer ist?

Vielen Dank im Voraus: Vijay K

public class GetListThread implements Runnable{ 

private List<String> names; 

public GetListThread(List<String> names) { 
    super(); 
    this.names = names; 
} 

@Override 
public void run() { 

    for(int i=0;i<4;i++){ 
     try { 
      names.add(ThreadLocalRandom.current().nextInt(1,10) + "A"); 
      Thread.sleep(2000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

    //System.out.println(names); 
} 
} 


public class TestThread { 

public static void main(String[] args) { 

    List<String> names = new ArrayList<String>(); 

    GetListThread g = new GetListThread(names); 
    Thread t = new Thread(g); 

    t.start(); 
    System.out.println(t.getState()); 

    for(String s : names){ 
     System.out.println(s); 
    } 
} 
} 
+0

Re, "wir laufen den Thread ... und warten auf seine Fertigstellung." Nein. Ihr Code wartet NICHT auf das Abschließen des Threads. Peter Lawrey hat das gleiche gesagt, aber nur für den Fall, dass er es nicht klar gemacht hat ... Der Weg, auf einen Thread zu warten, ist 't.join()' zu nennen. Die join() -Methode wird erst wieder angezeigt, wenn der Thread beendet wurde. Es synchronisiert sich auch mit der Beendigung des Threads. Ohne Synchronisierung gibt es keine Garantie dafür, dass Ihr Haupt-Thread sehen kann, was der andere Thread geschrieben hat, selbst wenn der andere Thread _is_ beendet ist. –

Antwort

2

Nachdem der Thread-Ausführung vorbei ist, ist es möglich, dass, wenn wir die Liste in main() iterieren wir die Saiten erhalten (Werte)

Ja, die Sammlung ist nicht threadsicher, es gibt keine Garantie, dass Sie jemals etwas sehen werden. Sie könnten sogar null Werte sehen, d. H. Wo die Größe korrekt ist, aber die Elemente nicht.

Kann jemand erklären, warum die Liste leer ist.

Allerdings warten Sie in diesem Fall nicht, also gibt es fast keine Chance, dass es alle seine Elemente hat.

Der Thread braucht Zeit zum Starten, daher ist es höchst unwahrscheinlich, dass Sie sogar das erste Element sehen.

+0

Danke viel !!, versucht mit Join(), es hat geklappt .. – user3839629

Verwandte Themen