了解Linux多线程概念
了解Android的一步任务机制
了解Android多线程的实现
Linux有真正意义的多线程吗?
linux如何支持多线程的?(附加两个系统库实现线程:LinuxThreads or NPTL(Native Posix Thread Library,radhat推出)。Linux2.6之前采用LinuxThreads。NPTL资源消耗更低,也是1:1的机构,但在信号处理,线程同步,存储管理等多方面进行了优化)
我们吧线程系统分两类
1、操作系统内核实现了现场模型(核心级线程)-Windows-线程与进程的多对多模型,线程的调度者在核内。windows线程调度效率比较高
Sample
Edraw画图工具,windows线程模型
OS kernel:
Process Model
Process Manage and Dispatch
Thread Model
Thread Manage and Dispatch
Libraries:
Porcess Piper
Thread Piper
UserApplication:
UserProcess
UserThread
ThreadPool
用户进程和用户线程是多对多的关系:Many to Many
2、操作系统核外实现的线程(用户级线程)-Linux,部分Unix-线程与进程的一对一、一对多模型,线程的调度者在核外。效率不高。
Sample:
Linux设计遵循:简单即是美。最开始对线程没有充分的考虑,没考虑多核cpu。内核中轻量级进程:为了减少进程切换的开销,把资源从主体分离,进程共享资源,形成轻量级进程。
OS kernel:
Process Model
Process Manage and Dispatch
Lite Process Model
Lite Process Manage and Dispatch
Libraries:
Porcess Piper
Thread Model
UserApplication:
UserProcess
UserThread
ThreadPool
用户进程和用户线程是一对一的关系:One to One
代码分析:
Pthread.c
Android如何进行多线程或者异步的处理?(和java一样)
new Thread:要调用start()方法
Runnable:是线程体,通过线程thread执行。
Handler(异步任务):post(Runnable)方法不启动新的线程,没有真正实现异步。Handler是通过HandlerThread 使得子线程与主线程分属不同线程的。实际上,HandlerThread 是一个特殊的线程,它是一个封装好Looper的线程。
AsycTask(异步任务)
(Handler和AsycTask后面有课程剖析源码)
百度了下Thread和Runnable区别,参考
http://www.jb51.net/article/37465.htm
http://www.iteye.com/problems/66985
http://blog.csdn.net/boyupeng/article/details/6208072
Runnable可能并没有开启一个新的线程,mHandler.post(r)其实是只调用线程的run()方法,然不是调用start()方法来启动一个新线程;而Thread必需执行start方法才启动一个新的线程,mars的java提到执行run()方法没有启动新的线程。
什么时候需要多线程和异步?
说白了就是耗时操作和定时操作(android耗时一般指超过5s;定时一般指一个schedule task的需要)
IO操作(网络操作,文件操作,数据库操作)
复杂的运算工作
消息接收方法中的耗时操作
计划任务
多线程同步Synchronized
多线程和界面交互
Android UI 主线程简单原则:不要Block UI Thread;不要在UI线程外直径操作UI.
1 Activity.runOnThread(Runnable)
2 View.post(Runnable);
View.postDelay(Runnable,long)
3 Handler
4 AsyncTask
baidu多线程和异步:
多线程可以制造异步的效果.有阻塞(不干活,白白等待)就需要异步 无阻塞无需异步,无需多线程.
异步简单说就是,数据处理不会阻塞,而是立即返回继续处理下一任务
异步是针对当前线程处理的时序上的概念。异步就是用多线程来实现的
异步和多线程并不是一个同等关系,异步是最终目的,多线程只是我们实现异步的一种手段。异步是当一个调用请求发送给被调用者,而调用者不用等待其结果的返回而可以做其它的事情。实现异步可以采用多线程技术或则交给另外的进程来处理。