Android 线程Thread的释放

来源:互联网 发布:svm 核函数 知乎 编辑:程序博客网 时间:2024/06/07 16:17

线程的控制一直是一个头疼的问题,控制不好的话,内存占用特别的厉害,那么有什么方法能让没有用的线程释放掉呢?

也许在有点需求中会同时开启几个线程来干某些事,但是在这些事情忙完后,Android自己不会立即将使用完的垃圾迅速回收掉,也就是说,咱们new一个线程,就会多出一份垃圾,一个两个的无关紧要,太多了或者设备性能不好时,问题还是会出现的。Thread的控制,还是咱们自己控制的好。

下面是现在我用这的方案,以一个内部类的方式实现Thread(例子中的MyThread)

public class MainActivity extends Activity {/** * 唯一的全局线程变量 */private volatile MyThread myThread;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);if (null != myThread) {myThread.stopMyThread();}myThread = new MyThread(10); // 十秒以后启动线程myThread.start();}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}/** * 以内部类的方式继承Thread */class MyThread extends Thread {private int daily = 0;public MyThread(int daily) {this.daily = daily;}public void stopMyThread() {MyThread tmpThread = myThread;myThread = null;if (tmpThread != null) {tmpThread.interrupt();}}public void run() {if (myThread == null) {return; // stopped before started.}try {for (int i = 0; i < daily; i++) {sleep(1000);}Thread.yield(); // let another thread have some time perhaps to stop this one.if (Thread.currentThread().isInterrupted()) {throw new InterruptedException("Stopped by ifInterruptedStop()");}// do somethingSystem.out.println("--------1----------");System.out.println("--------2----------");} catch (Throwable t) {System.out.println("--------Throwable--------" + t);System.out.println("--------over----------");// log/handle all errors here}}}}

接着在所在类中定义一个全局变量,
private volatile MyThread myThread;
每次在使用MyThread 线程时,先进行一次判断再去创建线程
if (null != myThread) { 
myThread.stopMyThread(); 

myThread = new MyThread(10); //十秒以后启动线程
myThread.start();

这样的话,自己去控制何时去释放内存,通过自己掊异常的形式去释放内存,释放的干干净净。


1 0