iOS多线程篇:NSThread
2016-05-08 03:44
435 查看
一、什么是NSThread
NSThread是基于线程使用,轻量级的多线程编程方法(相对GCD和NSOperation),一个NSThread对象代表一个线程,需要手动管理线程的生命周期,处理线程同步等问题。
二、NSThread方法介绍
1)动态创建
动态方法返回一个新的thread对象,需要调用start方法来启动线程
2)静态创建
由于静态方法没有返回值,如果需要获取新创建的thread,需要在selector中调用获取当前线程的方法
3)线程开启
4)线程暂停
NSThread的暂停会有阻塞当前线程的效果
5)线程取消
取消线程并不会马上停止并退出线程,仅仅只作(线程是否需要退出)状态记录
6)线程停止
停止方法会立即终止除主线程以外所有线程(无论是否在执行任务)并退出,需要在掌控所有线程状态的情况下调用此方法,否则可能会导致内存问题。
7)获取当前线程
8)获取主线程
9)线程优先级设置
iOS 8以前使用
这个方法的优先级的数值设置让人困惑,因为你不知道你应该设置多大的值是比较合适的,因此在iOS8之后,threadPriority添加了一句注释:To be deprecated; use qualityOfService below
意思就是iOS 8以后推荐使用qualityOfService属性,通过量化的优先级枚举值来设置
qualityOfService的枚举值如下:
NSQualityOfServiceUserInteractive:最高优先级,用于用户交互事件
NSQualityOfServiceUserInitiated:次高优先级,用于用户需要马上执行的事件
NSQualityOfServiceDefault:默认优先级,主线程和没有设置优先级的线程都默认为这个优先级
NSQualityOfServiceUtility:普通优先级,用于普通任务
NSQualityOfServiceBackground:最低优先级,用于不重要的任务
比如给线程设置次高优先级:
三、线程间通信
常用的有三种:
1、指定当前线程执行操作
2、(在其他线程中)指定主线程执行操作
注意:更新UI要在主线程中进行
3、(在主线程中)指定其他线程执行操作
四、线程同步
线程和其他线程可能会共享一些资源,当多个线程同时读写同一份共享资源的时候,可能会引起冲突。线程同步是指是指在一定的时间内只允许某一个线程访问某个资源
iOS实现线程加锁有NSLock和@synchronized两种方式。
五、线程的创建和使用实例:模拟售票
情景:某演唱会门票发售,在广州和北京均开设窗口进行销售,以下是代码实现
先监听线程退出的通知,以便知道线程什么时候退出
设置演唱会的门票数量
新建两个子线程(代表两个窗口同时销售门票)
执行结果:
可以看到,票的销售过程中出现了剩余数量错乱的情况,这就是前面提到的线程同步问题。
售票是一个典型的需要线程同步的场景,由于售票渠道有很多,而票的资源是有限的,当多个渠道在短时间内卖出大量的票的时候,如果没有同步机制来管理票的数量,将会导致票的总数和售出票数对应不上的错误。
我们在售票的过程中给票加上同步锁:同一时间内,只有一个线程能对票的数量进行操作,当操作完成之后,其他线程才能继续对票的数量进行操作。
运行结果:
可以看到,票的数量没有出现错乱的情况。
线程的持续运行和退出
我们注意到,线程启动后,执行saleTicket完毕后就马上退出了,怎样能让线程一直运行呢(窗口一直开放,可以随时指派其卖演唱会的门票的任务),答案就是给线程加上runLoop
新建两个子线程(代表两个窗口同时销售门票)
接着我们给线程创建一个runLoop
然后就可以指派任务给线程了,这里我们让两个线程都执行相同的任务(售票)
运行结果:
可以看到,当票卖完后,两个线程并没有退出,仍在继续运行,当到达指定时间后,线程2退出了,如果需要让线程1退出,需要我们手动管理。
比如我们让线程完成任务(售票)后自行退出,可以这样操作
运行结果:
如果确定两个线程都是isCancelled状态,可以调用[NSThread exit]方法来终止线程。
Next
接下来将更新GCD和NSOperation篇。
转载自:http://www.cocoachina.com/ios/20160412/15903.html
NSThread是基于线程使用,轻量级的多线程编程方法(相对GCD和NSOperation),一个NSThread对象代表一个线程,需要手动管理线程的生命周期,处理线程同步等问题。
二、NSThread方法介绍
1)动态创建
2)静态创建
3)线程开启
5)线程取消
6)线程停止
7)获取当前线程
iOS 8以前使用
意思就是iOS 8以后推荐使用qualityOfService属性,通过量化的优先级枚举值来设置
qualityOfService的枚举值如下:
NSQualityOfServiceUserInteractive:最高优先级,用于用户交互事件
NSQualityOfServiceUserInitiated:次高优先级,用于用户需要马上执行的事件
NSQualityOfServiceDefault:默认优先级,主线程和没有设置优先级的线程都默认为这个优先级
NSQualityOfServiceUtility:普通优先级,用于普通任务
NSQualityOfServiceBackground:最低优先级,用于不重要的任务
比如给线程设置次高优先级:
常用的有三种:
1、指定当前线程执行操作
3、(在主线程中)指定其他线程执行操作
线程和其他线程可能会共享一些资源,当多个线程同时读写同一份共享资源的时候,可能会引起冲突。线程同步是指是指在一定的时间内只允许某一个线程访问某个资源
iOS实现线程加锁有NSLock和@synchronized两种方式。
五、线程的创建和使用实例:模拟售票
情景:某演唱会门票发售,在广州和北京均开设窗口进行销售,以下是代码实现
先监听线程退出的通知,以便知道线程什么时候退出
售票是一个典型的需要线程同步的场景,由于售票渠道有很多,而票的资源是有限的,当多个渠道在短时间内卖出大量的票的时候,如果没有同步机制来管理票的数量,将会导致票的总数和售出票数对应不上的错误。
我们在售票的过程中给票加上同步锁:同一时间内,只有一个线程能对票的数量进行操作,当操作完成之后,其他线程才能继续对票的数量进行操作。
线程的持续运行和退出
我们注意到,线程启动后,执行saleTicket完毕后就马上退出了,怎样能让线程一直运行呢(窗口一直开放,可以随时指派其卖演唱会的门票的任务),答案就是给线程加上runLoop
比如我们让线程完成任务(售票)后自行退出,可以这样操作
Next
接下来将更新GCD和NSOperation篇。
转载自:http://www.cocoachina.com/ios/20160412/15903.html
相关文章推荐
- ios中URL中出现字典参数的处理问题
- IOS 模仿TableView封装
- iOS 返回时tableview内容上移
- iOS label根据内容自适应宽度
- IOS博客项目搭建-13-发微博弹窗
- iOS开发Touch ID的简单使用
- iOS开发--TableView详细解释
- IOS CoreAnimation
- iOS开发者必看的全球100个最佳博客
- iOS开发中的错误整理,启动图片设置了没有效果;单独创建xib需要注意的事项;图片取消系统渲染的快捷方式
- ios 绘图
- iOS 指纹识别
- IOS9中联系人对象的使用及增删改查操作的函数封装
- iOS8.0以后的相册
- iOS开发代码规范(通用)
- iOS 内存管理基本原则
- iOS动画
- iOS判断机型
- iOS Masonry介绍与使用
- iOS 自定义圆角进度条