日期:2014-05-20  浏览次数:20625 次

线程问题,关于对象在线程中的存储情况

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



List<Client> clients = new ArrayList<Client>();
Client c = new Client();
clients.add(c);
new Thread(c).start();


public class Client implements Runnable{
 @Override
 public void run(){
   while(flag1){
    clients.remove(this);
    flag =false;
   }
 }
}
多线程 线程 Java

------解决方案--------------------
引用:
Quote: 引用:

还有,new Thread(c).start()是否把对象copy了一份?

一个对象要被GC回收,是指这个对象没有任何引用指向后才会被回收,与C++里的Delete不一样。
如果把在线程中执行的对象赋空了,那么对象就被回收了,那线程该怎么办?结束还是继续?

我想你应该先再去看看Java的基础,引用与引用指向的对象,函数的参数与值传递。
一个对象可以有多个引用指向它,当没有任何引向指向这个对象后,这个对象才可以被GC回收。
函数原型:void foo(ObjectX a);

ObjectX x = new ObjectX(); // 在内存中分配一块内存给这个对象,把创建一个引用x指向这块内存(即对象)
函数调用: foo(x); // 这时指向这个对象有两个引用,上面的x与函数中的局部变量a.
如果你在函数foo中赋值a = null; 这时,仍然还有一个引用指向这个对象,因为这里的赋值并不影响上面的引用x

------解决方案--------------------
引用:
你说的我测试过了,确实没有对线程造成影响,因为线程中已经有了该对象的引用。另外,我想,我们能否操作线程内部对该对象的引用呢

没办法直接测试(如果有可能也会很麻烦)
我们可以变通测试,线程最终也是调用run方法,只不过是启动方式不同,和普通对象在这一点上没有什么两样,用普通对象测试好了

原因应该是对象在使用中会被阻止释放的