一状态概述
新建线程,线程就绪,执行线程,sleep,等待同步锁
NSThread thread = [[NSThread alloc] initWithTarget:selfselector:@selector(run)object:nil];
就绪cpu可以调用执行
[thread start];
概图:
二控制线程状态
1启动线程
- (void)start;
//进入就绪状态->运行状态。当线程任务执行完毕,自动进入死亡状态
2阻塞(暂停)线程
+ (void)sleepUntilDate:(NSDate)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;
//进入阻塞状态
3强制停止线程
+ (void)exit;
//进入死亡状态
Dome:
>
1进程
具有一定独立功能的程序关于某次数据集合的一次运行活动,他是 *** 作系统分配资源的基本单位。
进程是指系统正在运行的一个应用程序,就是一段程序的执行过程。
各进程之间相互独立,每个进程都运行在受保护的内存空间内,拥有独立运行所需的全部资源。
2 线程
进程的最小执行单元。线程是一个进程的实体。
一个进程要想执行任务,就必须至少又一个线程,当程序启动时,系统默认开启一条线程,也就是主线程。
3、 进程与线程的关系
线程是进程的执行单元,进程的所有任务都在线程中执行
线程是CPU分配和执行任务的最小单元
一个程序可以有多进程,一个进程可以有多线程 ,但是一个进程至少有一个线程
同一个进程内的线程共享进程内的资源
4 多线程原理
同一时间内单核CPU 只执行一个线程,多线程是CPU 在单位时间内在多个线程之间切换,造成多个线程被同时执行的假象。
多核CPU 就可以执行多个线程
多线程的目的是同步执行多个线程,来提高运行效率
5、多线程的优缺点
有点:提高执行效率 能够提高CPU的使用率
缺点:占用一定的系统内存空间 线程越多 CPU 调度线程的开销越大 程序设计复杂(线程之间的通信 数据共享)
6、多线程并发 与并行区别
并发:在一条线程上快速切换
并行: 利用多核CPU ,多线程同时进行
7、IOS 中的多线程
NSThread 需要手动创建 不需要销毁 子线程通信很难
GCD c语言,充分利用了设备的多核,自动管理线程生命周期。比NSOperation效率更高。
NSOperation 基于gcd封装,更加面向对象,比gcd多了一些功能。
8、多个网络请求如何执行下一步
使用GCD的dispatch_group_t
创建一个dispatch_group_t
每次网络请求前先dispatch_group_enter,请求回调后再dispatch_group_leave,enter和leave必须配合使用,有几次enter就要有几次leave,否则group会一直存在。
当所有enter的block都leave后,会执行dispatch_group_notify的block。
NSString str = @">
线程和进程在我们开发中,跟我们一直形影不离,那么什么是进程,什么是线程,它们又有什么关系,这篇文章将为您简单介绍。
线程概念
进程概念
地址空间:同⼀进程的线程共享本进程的地址空间( TLS是本地的线程栈存空间,线程的局部空间是某些 *** 作系统为线程提供的私有空间,只具备有限的容量,并不属于线程,由 *** 作系统单独安排的 ),⽽进程之间则是独⽴的地址空间。
资源拥有:同⼀进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独⽴的。
优点:
缺点:
时间⽚的概念:CPU在多个任务直接进⾏快速的切换,这个时间间隔就是时间⽚。
多线程同时执行
如果线程非常多
互斥锁⼩结
互斥锁参数
nonatomic⾮原⼦属性
atomic原⼦属性(线程安全),针对多线程设计的,默认值,保证同⼀时间只有⼀个线程能够写⼊(但是同⼀个时间多个线程都可以取值)
atomic本身就有⼀把锁(⾃旋锁)
单写多读:单个线程写⼊,多个线程可以读取
atomic:线程安全,需要消耗⼤量的资源
nonatomic:⾮线程安全,适合内存⼩的移动设备
iOS开发建议
所有属性都声明为nonatomic
尽量避免多线程抢夺同一块资源
尽量将加锁,资源抢夺的业务逻辑交给服务器处理,减少APP的压力
这篇文章简单介绍了线程与进程的概念,烦请大家不吝赐教。
一、RunLoop是什么?
事件循环,绝对不止是死循环这么简单的一个回答。实质上就是runloop内部状态的转换。
1用户态:应用程序都是在用户态,平时开发用到的api等都是用户态的 *** 作
2内核态:系统调用,牵涉到 *** 作系统,底层内核相关的指令。
runloop实际上是计算机内部进行的资源调度 *** 作。
iOS中的runloop就是循环来处理程序运行过程中出现的各种事件(比如说触摸事件、UI刷新事件、定时器事件、Selector事件),从而保持程序的持续运行,而在没有任何任务处理时,会让线程休眠,从而节省 CPU 资源,提高程序性能。
iOS中的runloop是用来处理事件的循环,NSRunloop是基于CFRunloop的封装,是线程不安全的;CFRunloop是一套C接口,是线程安全的。
二、runloop有哪些使用场景
1,检测crash,crash的起死回生;
2,线程的耦合;
3,监测APP的卡顿;
4,线程保活(让线程长时间存活,而不被自动销毁掉)等。
三,runloop的组成?
CFRunLoopRef //runloop对象包含以下内容:
CFRunLoopModeRef//运行模式
CFRunLoopObserverRef
CFRunLoopTimerRef
CFRunLoopSourceRef//sources源(事件源)
sources包含source0和source1,
source1:是基于Port的系统内核事件,主动唤醒,是基于字典的(key-value)。
source0:是非基于Port的,是用户事件,不能主动触发,需要手动唤醒(weakup),事件源一般存放在数组中,
runloop要想正常启动,需要添加一个source源,或者一个timer,有三种当方式:addPort,addTimer,CFRunloopAddSource。
四,runloop与线程的关系?
线程与runloop是一一对应关系,由runloop的foundation的CFRunloopGet0源码可以看出,线程与runloop是以键值对的形式存储,key值存当前线程,value值存与线程对应的runloop。
1,(线程与runloop是一一对应关系)一条线程对应一个RunLoop对象,每条线程都有唯一一个与之对应的 RunLoop 对象。
RunLoop 并不保证线程安全。我们只能在当前线程内部 *** 作当前线程的 RunLoop 对象,而不能在当前线程内部去 *** 作其他线程的 RunLoop 对象方法。
2,RunLoop 对象在第一次获取 RunLoop 时创建,销毁则是在线程结束的时候。
3,主线程的 RunLoop 对象系统自动帮助我们创建好了(原理如 13 所示),而子线程的 RunLoop对象需要我们主动创建和维护。
五,主线程需要保活吗?
子线城需要事件源,线程才能保活。
主线程不需要,(值为1)底层源码分析得。
六,runloop如何启动?,启动方式有哪些?
三种方式:run,runUntilDate,RunMode:beforDate。
前两种底层其实是无限循环调用RunMode方法,使用后runloop不会停止,故一般使用第三种,启动一次runloop,调用停止runloop方法后,便可结束runloop。
七,如何停止runloop?
CFRunLoopStop
若用strong修饰thread,需将thread设置为nil。
ViewController释放后,也需要需将thread设置为nil,防止内存泄露。
八,runloop原理?
在每次运行开启RunLoop的时候,所在线程的RunLoop会自动处理之前未处理的事件,并且通知相关的观察者。
具体的顺序如下:
通知观察者RunLoop已经启动
通知观察者即将要开始的定时器
通知观察者任何即将启动的非基于端口的源
启动任何准备好的非基于端口的源
如果基于端口的源准备好并处于等待状态,立即启动;并进入步骤9
通知观察者线程进入休眠状态
将线程置于休眠知道任一下面的事件发生:
某一事件到达基于端口的源
定时器启动
RunLoop设置的时间已经超时
RunLoop被显示唤醒
通知观察者线程将被唤醒
处理未处理的事件
如果用户定义的定时器启动,处理定时器事件并重启RunLoop。进入步骤2
如果输入源启动,传递相应的消息
如果RunLoop被显示唤醒而且时间还没超时,重启RunLoop。进入步骤2
通知观察者RunLoop结束。
以上就是关于(五)iOS开发之多线程—线程的状态全部的内容,包括:(五)iOS开发之多线程—线程的状态、ios 多次请求多线程怎么处理、ios 线程与进程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)