A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© sd110572 金牌黑马   /  2013-12-9 12:24  /  810 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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了一份?

评分

参与人数 1技术分 +1 收起 理由
贺奕凯 + 1

查看全部评分

3 个回复

倒序浏览
你只是将集合中的元素从集合中移出去了,并没有删除对象,
对象是不能自己删除的,是由jvm调用的,jvm在感觉他没用的时候就会将其删除
回复 使用道具 举报
首先你要明白,你在集合中存储的是对象的引用值,这个引用值指向了在堆中创建的对象,
你删除的是集合中的引用值,并不是堆内存中的对象。堆内存中的对象是由jvm删除的。
而你运行线程时,堆内存中的对象并没有被删除,这时候程序当然依然运行了!

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
看楼主晕了,你只是启动线程调用了run方法,然后run方法里面用集合的remove方法删除了其中的一个client对象,又不是把client类给删了~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马