Android 关于系统回收的知识整理

## Android 关于系统回收的知识整理

---

#### 问题背景

```

//在Activity中启动Thread

public class MyActivity extends Activity {

public void onCreate() {

...

new MyThread().start();

}

class MyThread extends Thread {

public void run() {

super.run();

while(true) {

Thread.sleep(10 * 1000);

}

}

}

}

//在Application中启动Thread

public class Application {

public void onCreate() {

...

new MyThread().start();

}

}

现象: 当系统回收或者异常崩溃时,在Application中启动的thread仍然在运//行,而在Activity中启动的thread则会停

```

因此,有以下四个问题:

1. 为什么会发生这个现象?

**原因其实很简单,自己犯错了,由于系统回收后或者系统异常崩溃后,都会调用Application.onCreate()。其实是崩溃或者回收后调用onCreate()重新启动了一个Thread**

2. 系统回收时,是以哪个维度(组件,进程还是线程)?

Android是一个Linux系统,为了方便管理应用间的私有数据,Android应用程序在系统中对应一个userid,而用用相同userid的应用程序将运行在同一个**进程**中,共享同一个Dalvik虚拟机。所以,基于操作系统上进程与线程的关系,可以得出结论,**一个应用程序至少对应一个进程,进程中至少有一个主线程,即UI线程**

3. 为什么系统回收后,或者系统异常崩溃后,会调用Application.onCreate()?

**目前还没查到资料**

4. 如何中止一个thread?

方案一,使用标识变量

```

public MyThread extends Thread {

private violate boolean mFlag = false;

public void stopMe() {

this.mFlag = true;

}

public void run() {

super.run();

while (!mFlag) {

Thread.sleep(..);

// do something

}

}

}

```

这种方案的问题在于,当thread正在休眠时调用了stopMe(),进程不能立即停止。因此就有了使用中断机制的方案二。

```

public MyThread extends Thread {

public void stopMe() {

interrupt();

}

public void run() {

super.run();

while (!isInterrupted()) {

try {

Thread.sleep(...);

// do something

} catch (InterruptException e) {

break;

}

}

}

}

```

两点需要说明:

1. 当thread在阻塞状态,即执行了Thread.sleep()时,如果发起中断,则会抛出中断异常被捕捉,直接用break跳出循环

2. 当thread不在阻塞状态,如果发起中断,则isInterrupted()会发挥true,直接跳出循环

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,523评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,958评论 18 399
  • 一、线程的生命周期 线程状态转换图: 1、新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线...
    我是嘻哈大哥阅读 4,474评论 0 8
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 7,192评论 1 15
  • Memcache是什么 Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,...
    零一间阅读 2,629评论 1 2