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);
}
}
}
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. –