线程完成后的参数状态

时间:2016-04-19 02:30:44

标签: java multithreading

问题:

假设我们将ArrayList传递给Runnable构造函数。在Runnable类中,我们将某些字符串添加到列表中。现在我们从main()运行Thread并等待它的完成。线程执行结束后,当我们在main()中迭代列表时,我们可能会获得Runnable类添加到列表中的字符串(值),因为在Heap中创建了对Arraylist的引用。 但是当我迭代列表时,它是空的。任何人都可以解释为什么列表是空的。

提前致谢: 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);
    }
}
}

1 个答案:

答案 0 :(得分:2)

  

线程执行结束后,有可能当我们在main()中迭代列表时,我们得到字符串(值)

是的,该系列不是线程安全的,不能保证你会看到任何东西。您甚至可能会看到null值,即大小正确但元素不正确的位置。

  

有人可以解释为什么列表是空的。

但是在你的情况下,你没有等待,所以它几乎没有机会拥有它的所有元素。

线程需要时间才能启动,因此您甚至不太可能看到添加的第一个元素。