ArrayListをRunnableコンストラクタに渡したとします。 Runnableクラスでは、特定の文字列をリストに追加します。今度はmain()からスレッドを実行し、その完了を待ちます。スレッドの実行が終了したら、Arraylistへの参照がヒープで作成されるため、main()のリストを反復するときに、Runnableクラスによってリストに追加された文字列(値)が取得される可能性があります。 しかし、リストを反復するとき、それは空です。リストが空である理由を誰もが説明できますか?事前に
ありがとう: ビジェイ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);
}
}
}
"私たちはスレッドを実行し、完了を待ちます。"あなたのコードは、スレッドが完了するのを待つことはありません。 Peter Lawreyも同じことを言っていましたが、それが明らかでない場合に備えて...スレッドが完了するのを待つ方法は 't.join()'を呼び出すことです。 join()メソッドは、スレッドが終了するまで戻りません。また、スレッドの終了と同期します。同期がなければ、メインスレッドは他のスレッドが終了しても他のスレッドが書き込んだ内容を見ることができるという保証はありません。 –