2016-04-19 6 views
0

質問:スレッドが完了した後の引数の状態

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); 
    } 
} 
} 
+0

"私たちはスレッドを実行し、完了を待ちます。"あなたのコードは、スレッドが完了するのを待つことはありません。 Peter Lawreyも同じことを言っていましたが、それが明らかでない場合に備えて...スレッドが完了するのを待つ方法は 't.join()'を呼び出すことです。 join()メソッドは、スレッドが終了するまで戻りません。また、スレッドの終了と同期します。同期がなければ、メインスレッドは他のスレッドが終了しても他のスレッドが書き込んだ内容を見ることができるという保証はありません。 –

答えて

2

スレッドの実行が終了した後、我々はmain()の中にリストを反復処理するときに我々が得ることにそれが可能である文字列(値)

はい、コレクションはスレッドセーフではありません。何かが表示されるという保証はありません。 nullの値が表示される場合もあります。つまり、サイズは正しいが、要素は正しくありません。

誰でもリストが空である理由を誰でも説明できますか。

しかし、あなたの場合、あなたは待っていないので、すべての要素を持つ可能性はほとんどありません。

スレッドの開始に時間がかかるため、最初に追加された要素が表示されることはほとんどありません。

+0

ありがとうalot !!、join()で試してみました。 – user3839629

関連する問題