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

一个关于线程的问题和手机性能的问题
1、我们知道java的线程在run函数退出后就处于dead状态了,那我的问题是,那这个thread对象是不是同时就被销毁了呢。有没有办法能把它垃圾回收了。如果没有,请高手解释一下,谢谢了。
2、另外,我想做一个程序,从服务器上down些文件下来,比如图象文件,写到rms里面,不过我接触的手机不多,由于rms的记录没有追加功能,我只能把整个down下来的byte数组一次性存进去。这些文件可能有30K左右,那我在内存里就得有30K的空间,再加上程序运行的其他占用,会不会把手机给撑爆了。但是,当我new这个大的byte数组的时候,该怎么判断内存够不够呢?还是直接判断new出来的那个数组是不是null?
3、然后我想了个可能的解决方法,就是把down下来的文件分成几个记录来存,然后读的时候几个记录读进来。那至少可以保证down文件的时候,内存不会爆掉。但是当我从几个记录里面来读的时候,还是会有危险。昨天看了image对象可以从inputstream创建,那我能不能创建一个inputstream,然后把这些记录里面的数据分别往里面写,然后由次inputstream创建我的image,这样是否会好一些。
大哥大姐帮忙呀。

------解决方案--------------------
1是否回收是有垃圾回收器决定的,如果想马上释放的话,显性置空;

2是用一个小的BUFFER区域,多次读写;

3至于创建图片,个人不觉得inputstream有太大的意义
------解决方案--------------------
学习
帮顶
------解决方案--------------------
1.线程的生命周期可以理解为run()函数从进去到处来,当线程执行完毕后,自动归入垃圾回收队列
2.rms的确没有追加功能,但你完全可以写一个小型数据管理系统,来构造自己的追加系统。当你new byte[]一维数组时,内存中的分配必须是连续分配的,所以如果太大,比如30K,就很有可能造成内存不足,这时会爆出一个OutOfMemory异常,程序就挂了。最好的方法是能拆分尽量拆分,比如把30K拆成10K的一个,然后写到3个rms的record里面
3.rms是无法创建inputstream的,只能读取一个Image的byte array,然后Image.createImage(byte[])。一般手机,只能读外部资源,而不能修改或者创建外部资源,因此,只有RMS可以存储
------解决方案--------------------
用写一个输入流来读取rms

比如某个rms.第一个记录存储有多少个数据块,后面N个数据块是有效数据

实现输入流的read()方法,依次打开各个Record,生成ByteArrayInputStream,然后读取,如果当前记录ID是最后一个,就返回-1