android c++ 线程,Android多线程分析之二:Thread的实现

本文深入分析Android中的线程实现,包括Android Thread与dalvik Thread的关系,线程的状态,构造过程及start()方法的执行流程。通过源码解析,展示了从创建到结束线程的生命周期,以及线程间如何通过JNI交互。
摘要由CSDN通过智能技术生成

Android多线程分析之二:Thread的实现在前文《Android多线程分析之一:使用Thread异步下载图像》中演示了如何使用 Thread 处理异步事务。示例中这个 Java Thread 类都是位于 Framework 层的类,它自身是通过 JNI 转调 dalvik 里面的 Thread 相关方法实现的。因此要分析 Androd 中的线程,就需要分析这两层中的与线程相关的代码,这就是本文要探讨的主题。本文将把 Framework 层中的 Java Thread 称为 Android 线程/Thread,而把 dalvik 中的  Thread 成为 dalvik 线程/Thread。

本文涉及到的 Android 源码路径:

android/libcore/luni/src/main/java/java/lang/Runnable.java

android/libcore/luni/src/main/java/java/lang/Thread.java

android/libcore/luni/src/main/java/java/lang/ThreadGroup.java

android/libcore/luni/src/main/java/java/lang/VMThread.java

android/dalvik/vm/native/java_lang_VMThread.cpp

android/dalvik/vm/Thread.cpp

首先来分析 Android Thread,这个类的源码在android/libcore/luni/src/main/java/java/lang/Thread.java,它实现了 Runnable 接口。Runnable 只有一个无参无返回值的 void run() 的接口:

/**

* Represents a command that can be executed. Often used to run code in a

* different {@link Thread}.*/

public interface Runnable {

/**

* Starts executing the active part of the class' code. This method is

* called when a thread is started that has been created with a class which

* implements {@code Runnable}.*/

public void run();

}

Android Thread 存在六种状态,这些状态定义在枚举 State 中,源码注释写的很清晰,在这里就不罗嗦了:

/**

* A representation of a thread's state. A given thread may only be in one

* state at a time.*/

public enum State {

/**

* The thread has been created, but has never been started.*/

NEW,

/**

* The thread may be run.*/

RUNNABLE,

/**

* The thread is blocked and waiting for a lock.*/

BLOCKED,

/**

* The thread is waiting.*/

WAITING,

/**

* The thread is waiting for a specified amount of time.*/

TIMED_WAITING,

/**

* The thread has been terminated.*/

TERMINATED

}

Android Thread 类中一些关键成员变量如下:

volatile VMThread vmThread;

volatile ThreadGroup group;

volatile boolean daemon;

volatile String name;

volatile int priority;

volatile long stackSize;

Runnable target;

private static int count = 0;

private long id;

ThreadLocal.Values localValues;

vmThread:可视为对 dalvik thread 的简单封装,Thread 类通过 VMThread 里面的 JNI 方法来调用 dalvik 中操作线程的方法,通过它的成员变量 thread 和 vmata,我们可以将 Android Thread 和 dalvik Thread 的关联起来;

group:每一个线程都属于一个group,当线程被创建时就会加入一个特定的group,当线程运行结束,会从这个 group 中移除;

daemon:当前线程是不是守护线程,守护线程只会在没有非守护线程运行的情况下才会运行;

priority:线程优先级,Java Thread 类的线程优先级取值范围为 [1, 10],默认优先级为 5;

stackSize:线程栈大小,默认为 0,即使用默认的线程栈大小(由 dalvik 中的全局变量 gDvm.stackSize 决定);

target:一个 Runnable 对象,Thread 的 run() 方法中会转掉该 target 的 run() 方法,这是线程真正处理事务的地方;

id:Android 线程 id,通过递增 count 得到该 id,如果没有显示给线程设置名字,那么就会使用 Thread+id 当作线程的名字。注意这不是真正意义上的线程 id,即在 logcat 中打印的 tid 并不是这个 id,那 tid 是指 dalvik 线程的 id;

localValues:线程本地存储(TLS)数据;

接下来,我们来看Android Thread 的构造函数,大部分构造函数都是通过转调静态函数 create 实现的,下面来详细分析 create 这个关键函数:

private void create(ThreadGroup group, Runnable runnable, Stri

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值