2 jinshilei135 jinshilei135 于 2014.12.03 14:41 提问

在循环线程中创建对象的问题

我的程序需要无限循环来接受来自Socket的数据,但是在无限循环中需要创建对象来接收数据,可是如果在循环中创建对象就会导致,对象被创建了之后就算是在后面被
object = null;了也是不会被回收,只会越堆越多 最后将程序UI卡住,请问 这个问题该怎么解决啊~~

2个回答

bensnake
bensnake   2014.12.04 09:25

问题当中没有详细说明使用什么语言,但是如果是C++使用new操作符和delete操作符是可以在特定的作用域中自由创建和销毁对象的。因为你想在循环体内部创建对象,所以不能使用在循环体内定义对象的方法,因为你用的循环体是无限循环,而循环体内定义的对象只有在作用域外(也就是循环体外)才能自动销魂。因此,唯一比较可行的方法应该是使用new和delete操作符。如果使用的不是C++/C#,那就要查看以下你用的语言是否有对应功能的操作符了。

eagleyan
eagleyan   Rxr 2014.12.06 08:09

看来你用的是java,但是这里并不清楚为什么你的对象被创建了之后不被回收。有个解决办法,但不是终极办法是使用WeakReference,你的程序贴上来比较好解决

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
避免在循环体中声明创建对象
这种情况在我们的实际应用中经常遇到,而且我们很容易犯类似的错误,例如下面的代码:   Java代码   for (int i = 0; i   Object obj = new Object();   System.out.println("obj= " + obj);   }   上面的做法会浪费较大的内存空间。正确的做法如下所示:   Java代码
避免在循环体中创建对象
http://blog.csdn.net/it_man/article/details/8225477 下面是参考网络资源总结的一些在Java编程中尽可能要做到的一些地方。   1. 尽量在合适的场合使用单例   使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面:   第一,控制资源的使用
java中的for循环里面创建对象和for循环外面创建对象之间的区别
上面的代码是我查询的司机轨迹在driverTracks中,然后我只想获取轨迹的经纬度放入到trackVo对象中,因为有多个经纬度,所以使用了List容器包含trackVo对象。 我当时想的时候把这个保存经纬度的对象在for循环外面创建,不放入到for里面。那么就不会消耗那么多的内存。如上,但是后面我发现我的list集合中的所有的经纬度都是同一个 而且是最后一个。一直不明白怎么回事? 原来是在
Android性能优化篇:Android中如何避免创建不必要的对象
Android设备不像PC那样有着足够大的内存,而且单个App占用的内存实际上是比较小的。所以避免创建不必要的对象对于Android开发尤为重要。 在编程开发中,内存的占用是我们经常要面对的现实,通常的内存调优的方向就是尽量减少内存的占用。这其中避免创建不必要的对象是一项重要的方面。 Android设备不像PC那样有着足够大的内存,而且单个App占用的内存实际上是比较小的。所以避免
深入分析虚拟机创建对象的两种方式以及如何在并发情况下实现线程安全
深入分析虚拟机创建对象的两种方式以及如何在并发情况下实现线程安全创建对象的两种方式如果了解过虚拟机,我们都知道虚拟机在创建对象的时候采用两种方法: 指针碰撞 空闲列表 那么这两种方式有什么不同,又分别是怎么实现的呢?指针碰撞首先我们说下指针碰撞,我们可以把Java堆想象成一个大小是100的线性内存(纯粹为了容易看懂才去设定的一个值),起始位置是0,结束位置是100,也就是0-100,在起始位置0的地
javascript创建对象以及使用for(.. in ..)遍历对象的属性!
var txt=""; var person=new Object(); person.name="yuanqiao"; person.sex="boy"; person.age=15; for(x in person){ txt=txt+"  " + person[x]; } document.write(txt);
结合网上内容,分享一个,java用for循环创建i个对象,的方法
还是个菜鸟程序猿,今天遇到需要用for循环创建(或者叫添加)多个对象然后存入数据库的问题,上网搜了一圈,然后自己试了一下,居然成功了, 现在来把个人成果来分享下,仅供参考,敬请斧正,不喜勿喷。 额,肿么感觉现在写文章结尾都想用分号了呢;;; 以下代码Demo: public class TestDemo { public static void main(String[]
创建线程对象的三种方式
创建线程对象的三种方式 1、自定义类继承Thread类,重写run方法。 2、自定义类实现Runnable接口,重写run方法。使用静态代理创建Thread 对象,启动线程。 3、生成一个匿名类,并重写run方法。
java线程帮助类(无限循环)
/** * 对监视线程的抽象。封装一种特殊的线程行为:一旦被创建就永远循环地做某件事情, * 直到该线程被杀死。这是一个抽象类,从Thread类继承而来,不能直接实例化,其子类 需要覆盖方法task()来完成具体的功能。 * * @version 1.0 */ public abstract class WatchThread extends Thread { /*
对象创建语句放在循环外和循环内的区别
每一个对象创建的时候都会有一个ID。List对象在执行add方法的时候是将对象的引用放入List中。上述代码中创建对象的语句如果放在外面,在将对象add到List中时,前后向List中add的对象都是同一个,所以放在外面的时候最后List中的对象是同一个对象。 @Override public List<EasyUITreeNode> getItemCatList(long paren