黑马程序员技术交流社区

标题: 对象在线程的存储情况 [打印本页]

作者: sd110572    时间: 2013-12-9 12:24
标题: 对象在线程的存储情况
本帖最后由 sd110572 于 2013-12-9 15:18 编辑
  1. List<Client> clients = new ArrayList<Client>();
  2. Client c = new Client();
  3. clients.add(c);
  4. new Thread(c).start();


  5. public class Client implements Runnable{
  6. @Override
  7. public void run(){
  8.    while(flag1){
  9.     clients.remove(this);
  10.     flag =false;
  11.    }
  12. }
  13. }
复制代码

在线程中执行中,把执行线程的对象删除,为什么不影响线程的运行
还有,new Thread(c).start()是否把对象copy了一份?

作者: hel    时间: 2013-12-9 13:13
你只是将集合中的元素从集合中移出去了,并没有删除对象,
对象是不能自己删除的,是由jvm调用的,jvm在感觉他没用的时候就会将其删除
作者: Cheers_for_CRAZ    时间: 2013-12-9 15:03
首先你要明白,你在集合中存储的是对象的引用值,这个引用值指向了在堆中创建的对象,
你删除的是集合中的引用值,并不是堆内存中的对象。堆内存中的对象是由jvm删除的。
而你运行线程时,堆内存中的对象并没有被删除,这时候程序当然依然运行了!
作者: Weix1992    时间: 2013-12-9 16:47
看楼主晕了,你只是启动线程调用了run方法,然后run方法里面用集合的remove方法删除了其中的一个client对象,又不是把client类给删了~~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2