auto.js停止所有线程_Android多线程基本原理

一.多线程概念、原理

1、线程是CPU基本的执行单元,是基本的多任务调度单元,一个进程至少有一个线程在负责控制程序的执行

2c9d935852e23a2ed9e9669571dab39d.png
常见的线程调用时序

2、每个线程有自己的独立状态和堆栈,线程之间可以相互通信、同步

28f763349a8839be1f3d346636e087e0.png
线程基本状态机

3、Activity和所有的UI控件操作都在一个主线程中(UI线程),UI线程的基本实现原理

eef87040eb3775dbe7c5fb587f5de31f.png
UI线程内部执行时序和代码示意图

4、开发人员可以根据自己的需要来创建新的线程

最基本的从Thread类来继承实现Thread.run()方法,或者实现Runnable接口

二.多线程基本创建和停止

1、创建和启动一个多线程

b82ba2ad2c1fb731784549386b98b907.png
通过Thread来实现一个最基本的多线程示例

2、正常停止多线程

7c516ecd25f9e29b7d602359d9f90355.png
常见的多线程停止方式

三.临界资源的访问

1、多任务中的PV操作

3c6f1a552ff48a5288c566f278eec395.png
操作系统基本原理 P-V操作

2、Android中对于临界资源的控制方法:

2cac39e5c8534b63369aef682d5095a5.png

3、使用Synchronized关键字

1ca8c29cf91bbc1ce0a264c0936e723e.png

4、使用Lock锁对象

63127e9f39c84d9b9d465b23c5bd8b30.png

5、锁机制的执行次序

2f7055719558585d962a645544dd33dd.png

6、锁的粒度

7f6e1972c2d1e61cb153bceceae5ec3a.png

四.多线程的同步机制

1、采用轮询方式进行同步

a90a97e2535fbd4f97e8ce21ea1559f6.png

ee230b9a3074eb76cffe343455c07dda.png

2、采用信号量进行同步

27c86c0ebb554eceac30880195486031.png

a243e4243722561bb452ca944997866d.png

五.常用多线程框架模型

1、消息队列模型

50f6813de520a7f1e4c8f6b22b5c4305.png

408d1a158f79bf414faebf2d202c6c20.png

57a996d5aa17080a8e7bd077a1582fb1.png

2、状态机模型

dde94750473bd529b0a892c768c3a353.png

7bfbc64333cba9a893983ce3d2567628.png

b23ee754e634b10535f275c8c1a8275f.png

六.多线程开发常见问题

1、时间片分片不够细导致不能及时停止

d726ad5bbb272a1bbdf60cfa4438a95d.png

2、不同步等待线程结束

442444912f10a33f72ddb2fb4bdf8d57.png

3、线程停止时的内存泄漏

aa2b132e46d570a5ee149da5bfc8b8dd.png

4、临界资源锁的问题

4.1 临界资源没有加锁

4.2 锁的粒度太大

4.3 l临界代码段执行的时间过长

volatile用处说明

在JDK1.2之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的。而随着JVM的成熟和优化,现在在多线程环境下volatile关键字的使用变得非常重要。

在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。

要解决这个问题,就需要把变量声明为volatile(也可以使用同步,参见http://blog.csdn.net/ns_code/article/details/17288243),这就指示JVM,这个变量是不稳定的,每次使用它都到主存中进行读取。一般说来,多任务环境下,各任务间共享的变量都应该加volatile修饰符。

Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。

Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才将私有拷贝与共享内存中的原始值进行比较。

这样当多个线程同时与某个对象交互时,就必须注意到要让线程及时的得到共享成员变量的变化。而volatile关键字就是提示JVM:对于这个成员变量,不能保存它的私有拷贝,而应直接与共享成员变量交互。

volatile是一种稍弱的同步机制,在访问volatile变量时不会执行加锁操作,也就不会执行线程阻塞,因此volatilei变量是一种比synchronized关键字更轻量级的同步机制。

使用建议:在两个或者更多的线程需要访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,没必要使用volatile。

由于使用volatile屏蔽掉了JVM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。

七.相关的参考资料

1、https://developer.android.google.cn/reference/java/lang/Thread.html

2、http://blog.csdn.net/brooknew/article/details/6610771

3、http://blog.csdn.net/caizhongda/article/details/7228873

4、lUC/ OS-II:源码公开的实时嵌入式操作系统

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值