问题:
假设我们将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);
}
}
}
答案 0 :(得分:2)
线程执行结束后,有可能当我们在main()中迭代列表时,我们得到字符串(值)
是的,该系列不是线程安全的,不能保证你会看到任何东西。您甚至可能会看到null
值,即大小正确但元素不正确的位置。
有人可以解释为什么列表是空的。
但是在你的情况下,你没有等待,所以它几乎没有机会拥有它的所有元素。
线程需要时间才能启动,因此您甚至不太可能看到添加的第一个元素。