在java中创建一个线程, new Thread对象, 并调用它的start()方法, 这是每一个java程序员都知道的事.在linux C中创建一个线程, 使用pthread_create(&thread, NULL, thread_get_str, NULL)函数, 这是每一个linux C程序员都知道的事.我们不禁要问,在android中, java线程和c线程到底有没有关系,如果有,到底是怎么样的?下面开始神秘的dalvik线程创建之旅:

Thread thread = new Thread();
thread.start();
//Thread.java
package java.lang;
public class Thread implements Runnable {...public synchronized void start() {checkNotStarted();hasBeenStarted = true;VMThread.create(this, stackSize);}...}
//VMThread.java
package java.lang;
class VMThread {...native static void create(Thread t, long stackSize);...
}

下面进入VMThread.java通过JNI对应的C++文件, java_lang_VMThread.cpp
https://android.googlesource.com/platform/dalvik.git/+/android-4.2.2_r1/vm/native/java_lang_VMThread.cpp

/** java.lang.VMThread*/
static void Dalvik_java_lang_VMThread_create(const u4* args, JValue* pResult)
{Object* threadObj = (Object*) args[0];s8 stackSize = GET_ARG_LONG(args, 1);/* copying collector will pin threadObj for us since it was an argument */dvmCreateInterpThread(threadObj, (int) stackSize);RETURN_VOID();
}

进入http://osxr.org/android/source/dalvik/vm/Thread.cpp

//Thread.cpp
bool dvmCreateInterpThread(Object* threadObj, int reqStackSize)
{...int cc = pthread_create(&threadHandle, &threadAttr, interpThreadStart, newThread);...
}
到这里我们就可以清晰的得出结论, android dalvik其实就是通过Linux C的pthread_create实现的线程创建.

linux 线程:

线程是一种轻量级的进程。
进程的通信机制主要包括无名管道、有名管道、消息队列、信号量、共享内存以及信号等。这些机制都是由linux内核来维护的,实现起来都比较复杂,而且占用大量的系统资源。
线程间的通信机制实现起来则相对简单,主要包括互斥锁、条件变量、读写锁和线程信号等。

消息队列是消息的链接表,存放在内核中。其实质上就是一个内核链表,消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。Linux用宏MSGMAX和MSGMNB来限制一条消息的最大长度和一个队列的最大长度。对消息队列有写权限的进程可以按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读出消息。消息队列是随内核持续的并和进程相关, 系统中记录消息队列的数据结构 (struct ipc_ids msg_ids)位于内核中,系统中的所有消息队列都可以在结构msg_ids中中找到访问入口。只有在内核重起或者显示删除一个消息队列时,该消息队列才会真正被删除。

linux内核中的消息队列本质上是进程通信的方式,在内核中,每一个线程如果试用了消息队列通信,那么本质上被看作轻量级进程。

所以对diavik / ARP中,其线程机制就是调用linux的线程机制(消息列队通信) ,hotspot jvm则是在jvm层面上有自己的线程机制,(以N-M映射到linux 内核中的线程)这一层没有了消息队列这一概念。所以 这也是hotspot与diavik的 很大的不同。

Dalvik/ART(ANDROID)中的多线程机制(4)相关推荐

  1. android classloader异常,Android中ClassLoader类加载机制

    Android中apk的构建过程 构建apk 如图 所示,典型 Android 应用模块的构建流程通常依循下列步骤: 编译器将您的源代码转换成 DEX(Dalvik Executable) 文件(其中 ...

  2. Android中的多线程(字节跳动)

    文章目录 Handler机制(Android中的消息队列机制) Handler机制为Android系统解决了以下两个问题 Handler常用方法 Handler的使用 补充知识点 Handler原理 ...

  3. Android中的消息机制

    Android 中的消息机制其实就是指的是 Handler 消息机制以及附带的 Looper 和 MessageQueue 的工作流程. 1.Android 为什么提供Handler? 解决子线程不能 ...

  4. 重温Android中的消息机制

    引入: 提到Android中的消息机制,大家应该都不陌生,我们在开发中不可避免的要和它打交道.从我们开发的角度来看,Handler是Android消息机制的上层接口.我们在平时的开发中只需要和Hand ...

  5. Android中的多线程编程与异步处理

    Android中的多线程编程与异步处理 引言 在移动应用开发中,用户体验是至关重要的.一个流畅.高效的应用能够吸引用户并提升用户满意度.然而,移动应用面临着处理复杂业务逻辑.响应用户输入.处理网络请求 ...

  6. 浅析Android中的消息机制

    在分析Android消息机制之前,我们先来看一段代码: [java] view plaincopy public class MainActivity extends Activity impleme ...

  7. 探索Android中的Parcel机制(上)

    一.先从Serialize说起 我们都知道JAVA中的Serialize机制,译成串行化.序列化--,其作用是能将数据对象存入字节流其中,在须要时又一次生成对象.主要应用是利用外部存储设备保存对象状态 ...

  8. 探索Android中的Parcel机制(上) .

    一.先从Serialize说起 我们都知道JAVA中的Serialize机制,译成串行化.序列化--,其作用是能将数据对象存入字节流当中,在需要时重新生成对象.主要应用是利用外部存储设备保存对象状态, ...

  9. Android中Alarm的机制

    本次给大家分析的是Android中Alarm的机制所用源码为最新的Android4.4.4.首先简单介绍如何使用Alarm并给出其工作原理,接着分析Alarm和Timer以及Handler在完成定时任 ...

  10. 探索Android中的Parcel机制(下)

    上一篇中我们透过源码看到了Parcel背后的机制,本质上把它当成一个Serialize就可以了,只是它是在内存中完成的序列化和反序列化,利用的是连续的内存空间,因此会更加高效. 我们接下来要说的是Pa ...

最新文章

  1. MSSQL扫盲系列(4)-系统函数
  2. 开源 java CMS - FreeCMS2.8 自定义标签 siteOne
  3. 云效(原RDC)如何构建一个基于Composer的PHP项目
  4. UITextField
  5. 恩施市2021年高考成绩查询,2021年湖北恩施各高中中考分数线及录取时间结果查询安排...
  6. Python 将输出内容保存在text文件中
  7. MySQL 5.7.12新增MySQL Shell命令行功能
  8. linux中cron表达式指南
  9. 宝塔Inode信息使用率100%满了怎么清理?
  10. Unity3D游戏框架之dll反编译和混淆
  11. 群晖套件 Transmission 汉化
  12. python相关性分析
  13. 实现Office文档的在线查看等功能
  14. Stepper Motor > 步进电机控制相关参数缩写
  15. server2012离线安装.netfx3.5/dotnetfx3.5环境
  16. 自相关和相关的物理意义
  17. 杭电计算机研究生复试,杭电计算机考研经验
  18. 针对网络脆弱性的攻击图分析方法总结
  19. 【华为OD机试真题 JAVA】连续出牌数量
  20. Linux Fair Queue Packet Scheduler (FQ)公平队列报文调度器

热门文章

  1. 获取python工程下面的所需的所有开源依赖包
  2. 神经网络中的病态曲率-Pathological Curve-举例
  3. OpenCV学习笔记七-创建滑动条
  4. 《机器学习》 周志华学习笔记第二章 模型评估与选择(课后习题)
  5. NoSQL, Clojure
  6. c#中计算三角形面积公式_看着有点迷的三角形面积计算
  7. 螺丝上的十字磨没了_十字起子和无限下拉菜单
  8. Java集合-ArrayList源码解析-JDK1.8
  9. [python] redis 模块 -- 实现 python 与 Redis 数据库的结合
  10. angular i18n 国际化 多语言