线程问题,关于对象在线程中的存储情况
在线程中执行中,把执行线程的对象删除,为什么不影响线程的运行
还有,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的基础,引用与引用指向的对象,函数的参数与值传递。
一个对象可以有多个引用指向它,当没有任何引向指向这个对象后,这个对象才可以被GC回收。
函数原型:void foo(ObjectX a);
ObjectX x = new ObjectX(); // 在内存中分配一块内存给这个对象,把创建一个引用x指向这块内存(即对象)
函数调用: foo(x); // 这时指向这个对象有两个引用,上面的x与函数中的局部变量a.
如果你在函数foo中赋值a = null; 这时,仍然还有一个引用指向这个对象,因为这里的赋值并不影响上面的引用x
------解决方案--------------------你说的我测试过了,确实没有对线程造成影响,因为线程中已经有了该对象的引用。另外,我想,我们能否操作线程内部对该对象的引用呢
没办法直接测试(如果有可能也会很麻烦)
我们可以变通测试,线程最终也是调用run方法,只不过是启动方式不同,和普通对象在这一点上没有什么两样,用普通对象测试好了
原因应该是对象在使用中会被阻止释放的