1.Thread类及常用的同步类

Thread类是android为线程操作而做的一个封装类。在Thread这个类中,创建真实线程的工作是在run函数中完成。

函数代码分析:

Threads.cpp

//在这个函数中创建工作线程。

Thread::run(const char* name, int32_t priority, size_t stack)

{

......

if (mCanCallJava) {

res = createThreadEtc(_threadLoop,

this, name, priority, stack, &mThread);

} else {

res = androidCreateRawThreadEtc(_threadLoop,

this, name, priority, stack, &mThread);

}

}

分析这个线程创建函数中,要注意两点内容:

(1)mCanCallJava无论是true or flase,最后都是调用androidCreateRawThreadEtc(),完成了对于真实线程的创建任务,就是说此时有了可以工作的线程。

(2)mCanCallJava == true时,会实现线程跟androidruntime的关联。通过,androidruntime:: startReg()函数的调用,进一步使得androidCreateRawThreadEtc()成功进入到javaThreadShell函数的调用中,javaThreadShell会实现跟JNI环境的关联,即attach到JNI环境中,此时这个线程就可以很方便的调用JNI的函数了。

结论:

就是说由于mCanCallJava == true的关系,完成的任务是在实现创建真实线程之间,把这个关系先跟JNI环境联系起来,这样做的目的是之后创建好的thread可以很好的自由使用JNI函数。第二,这个创建好的thread推出后会从JNI环境中dettach,实现释放资源的功能。这个第二点中还起到了保护dalvik的功效,因为JNI环境下做的dettach工作之后,被dalvik检查到,就不会做abort。

2. 常见的同步类

android中常用的是有3种分装好的同步类,Mutex,Conditon,和简单的原子操作。

(1)Mutex

三个方面要关注

首先是初始化

其次,是lock(),表示要为临界资源上锁,这时候临界资源可以被你使用,其他要等待你对资源的释放信号,即unlock信号。

最后,使用完了临界资源之后,告知其他人unloock(),可以使用资源了。

其中,一个小问题是,tryLock()只是尝试要锁,必须根据返回值判断是否锁住。

(1.2)要说的是自动锁AutoLock类,它是Mutex的内部类,完成的是将AutoLock显示调用lock(),unlock()的封装,放到它自己的构造和析构中,此时可以直接触发这两个函数。

具体使用:

先定义一个Mutex类对象,在使用这个类对象的时候定义一个AutoLock.

Mutex xLock;

AutoLock autoLock(xLock);

这样就可以了.

(2)condition条件类

明确多线程同步中,条件类是如何使用的;

线程A,完成后接着线程B才能完成,就是说,B必须等待A完成后才能开始,所以加上一个条件,即使用这个条件类condition,这个条件类对象成立时,这样B线程开始工作,就这样。

具体是这样工作的:

线程A完成工作后接着会触发这个条件,这时,受条件限制的B线程就被唤醒,这时B就可以工作了。此时A称之为触发者,而B来说就是等待者。

class condition{

};

的定义也是比较简单的,其中主要的函数说明:

.wait():wait(Mutex & mutex),这个wait的含义是和B保持一致的,Mutex & mutex是表示的A的情况,mutex.unLock()的时候这个等待函数会被触发,这时候

void signal()出来了,说明条件满足啦,B可以开始工作了,void broadcast()通知出去,工作完成。

注意condition的使用:

class condition中的所有成员函数必须放在一个Mutex的lock和unlock范围之内,只是强制性的。

以Threads::requestExitAndWait() 函数为例。

这个函数的功能是等待工作线程的退出。

假设这样一种情况,当前工作线程退出之后,即A完成工作,正常退出之后,B收到后就开始进行工作。这时候condition是在requestExitAndWait()中工作的。当这个当前工作线程A正常退出前先condition.wait(),这样没有了后顾之忧,接着B就能及时工作了。

描述完毕。

(3)

原子操作:就是说在该操作执行完之前绝对不会被其他任务打断。即,原子操作是最小的执行单位。正式由于这样的原因,原子操作避免了锁的使用,更简洁。

更多相关文章

  1. android 实例和分析
  2. 字节跳动面试官:Android源码的Binder权限是如何控制?
  3. android事件分发(三)重要的函数requestDisallowInterceptTouchEven
  4. android Support Annotations(注解支持)
  5. android Toast大全
  6. Linux/Android——usb触摸屏驱动 - usbtouchscreen (一)
  7. Android, BaseAdapter 处理大数据量时的优化
  8. Android(安卓)逆向学习之《Smail语法查询手册》
  9. Android(安卓)FrameWork——Binder机制详解

随机推荐

  1. Android(安卓)5.0(L) 的MediaSession架构
  2. android通知栏提示
  3. Android(安卓)获取Sim卡联系人
  4. android 蓝牙各种UUID
  5. android给View设置边框 填充颜色 弧度
  6. Intent.FLAG 属性大全
  7. Android中帧动画
  8. Android悬浮窗口
  9. Android(安卓)getMeasuredHeight()与getH
  10. 第一行代码:AlertDialog