在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一、为什么要使用多线程? 1、循环模拟耗时任务
1、同步执行 2、异步执行 (香烟编程小秘书) 3、进程 系统中正在运行的一个应用程序 每个进程之间是独立的, 均运行在其专用的且受保护的内存空间 通过活动监视器,可以查看mac系统中的开启进程 (外挂修改游戏进程中的数据,外挂用c汇编等底层)
4、线程 1个进程由一个或多个线程组成 是进程的基本执行单元(至少一个线程)
多线程: 1个进程可开启多个线程,多个线程可以“同时”执行不同任务 进程-公司,线程- 员工:老板:主线程 多线程可以提高程序的执行效率
1、安卓相隔一个虚拟机 2、每一个晶体管中的核很小,逻辑没有苹果单核性能高 3、苹果的cpu号称可以击败台式机的cpu
单核执行原理: 4个线程,线程1执行完紧接线程2? 假设成立:线程1死循环还能跑?所以假设不成立 多线程:不等待线程1执行完毕再执行线程2 之所以说多线程同时进行,其实是切换进行,只是时间很快近乎同时
多线程的优点: 1、能适当提高程序的执行效率 2、能够适当的提高资源的利用率 多线程的缺点:(成本:时间成本/空间成本 1、空间成本:每个线程占用的空间512kb 2、时间成本:创建一个线程 大约90毫米 3、线程间的通信,多线程的数据共享
总结:线程之间是cpu切换执行
1、老板——主线程(UI线程) 程序的入口:main (AppDelegate)程序的生命周期 所有的代码都是通过线程执行的 主线程干的都是ui相关的事 performSelectioInBackground 重点:Ios中多线程的实现方案: 1、pthread:历史悠久,,表示一种可以跨平台的方法,一段代码可以在iphoneandroid、windows几乎不用:语言C 使用难度大,程序员要自己管理它的生命周期,
2、NSThraad (NS开头术语Foundation框架,oc语言,面向对象:封装继承动态) 还是要自己管理生命周期,偶尔使用
3、GCD 也是C语言写的,经常被使用,苹果开发的技术,充分利用多核,很好优化,“透明” 自动管理线程
4、NSOperation:(NS OC写的foundation框架中的) 对GCD的封装:相当于继承gcd的优点 比GCD多了一些更简单实用的功能,使用更加面向对象
ptread的介绍: p什么意思:p代表POSIX 表示可移植(跨平台) 1系统导入的头文件,用尖括号 #import<pthread.h>
pthread_create: 参数一、pthread_t:线程的标示 参数二:ptheard_attr:attribute:属性 c语言的话为空填入NULL 参数三、:void *(*)(void *) :函数签名 void *代表:约等于oc中的id 任意一个对象 返回值 (*)函数名 (void *)参数
创建一个函数 线程要运行的函数: void * task (void *param) { return NULL; } 填入:task:函数的首地址 参数四: void *restrict:给第三个参数的函数一个参数 NULL;
5、pthread _create返回值是一个数字 “0”代表成功,非0则失败 if(result == 0) NSLog(@“ok”); 说明线程创建成功了 6、 [NSThread currentThread]:打印当前线程 只要number不等于1 就是一个子线程,number=1就是一个主线程中运行
[_bridge NSString]桥接,在oc中写c 桥接的意思是:默认ARC下对OC对象有内存管理,不对C变量管理,桥接的作用是,C变量在适当的时候被释放
总结: 1、导入头文件 2、创建线程pthread_Create 3、创建函数方法 void *task(void*param) 4、传递参数
二、NSThread的简单介绍
NSThread=[NSThread alloc initWithTarget:] 参数1:对象 参数2:方法 参数3:方法需要的参数 NSThread这样创建是不会跑的 这样写只是在内存中创建一个对象 2、开启线程 [thread start]
方法二、创建线程: -(void)demo2 { //detach:分离,可以理解为创建 detachNewThreadSelector:
参数1、方法 参数2: 对象 参数3:方法需要的参数 [NSThread detachNewThreadSelector。。] } 方法二的确定:如果你要对NSThread进行其他设置不便 但是代码量少了
方法三、 参数1:方法 参数2:方法的参数 为啥没有参数:因为用的是self [self performSelectorInBackground 压根没提thread:隐式创建线程
线程的生命周期: 线程的状态: 1、创建线程 2、开启线程:在内存中的变化:多了一个可调度线程池:好多线程,且CPU可以调度它
new(新建)-》就绪(Runnable)——》CPU调度当前线程——》运行(running-》阻塞状态-》运行-》死亡
就绪:这个线程除了CPU资源之外,别的资源都已到位
cpu的来回切换,使CPU在当前线程和别的线程之间来回切换,而线程则在运行和就绪这两个状态之间来回切换
运行的时候,如果除了cpu资源外,其它资源也没有了,那么就会调用Sleep方法\等待同步锁
因为不可调度,就会进入阻塞状态 离开可调度线程池
要是苏醒了 线程会从阻塞状态进入运行状态吗? 不会! 这时候不会直接到运行状态,而是回到就绪状态(sleep倒是\得到同步锁)
线程任务执行完毕 会死亡(死亡可以是自杀:也可以是他杀:强制结束线程)
三、NSThread的常用属性 线程确实是通过切换来进行 同时创建两个线程
第一个0时由哪个线程打印出来的? 不清楚:那就给线程起名字
thread.name =@“ ”
thread.threadPirority 多线程的基本概念总结: 1、同步 2、异步 区别:同步是任务顺序执行,异步是同时间可多个运行 3、进程:当前计算机中正在运行的应用程序 4、线程:进程的基本执行单元,一个进程中有一个或多个线程
5、多线程的生命周期和常见属性
特点:线程来回切换运行 主线程:不能在主线程执行耗时操作
优点: 适当的提升资源的利用率 提升程序的执行效率 缺点: 线程不是开的越多越好 因为:时间成本大约90毫秒和空间成本大约512kb
pthread了解: NSThread 有三种创建方式 1、alloc initWithTargrt 2、detachNew 3、performSelectorInBackground
线程的生命周期: 1、新建 2、就绪 3、运行 4、阻塞 5、死亡
常见属性 1、name 2、优先级threadPirorty
|
请发表评论