多线程实现方式
1.NSThread NSOperation GCD
一,线程的概念
程序,进程,线程
程序:一些指令的集合
进程:运行中的程序,需要占用内存空间,也是操作系统分配资源的基本单位
线程:是进程的基本组成部分,每个进程至少有一个线程 iOS应用程序默认创建了一个主线程,系统会自动维护这个线程的生命周期,如果是操作时间比较长的代码,比如:网络下载,数据库的操作,如果在主线程执行,会阻塞主线程,所有我们需要创建自己的主线程
二,为什么使用线程
三,(NSThead) 怎样创建线程
1> 第一种方式
initWithTarget:(id)target selector:(SEL)selector object;(id)object
/**
第一个参数:线程执行体方法所属的对象
第二个参数:线程执行体方法所属的 方法
第三个参数:线程执行体方法所属的实参
*/
NSNumber *n = @50;
NSThread *t = [[NSThread alloc] initWithTarget:self selector:@selector(creatThreadTwo:) object:n];
//设置线程的名字
t.name = @"线程B";
// [t setName:@"线程B"];
//这种方式创建的线程,需要手动启动线程
[t start];
2> 第二种方式
detachNewThreadSelector:@selector(SEL) toTarget:target withObject:object
/**
* @param SEL 线程执行体的方法
* @param toTarge 线程执行体所属的对象
* @param ithObject 线程执行体方法传递的实参
*
*/
NSNumber *n = @100;
// @one === [NSNumber numberWiuthInt:100];
//创建并启动一个线程
[NSThread detachNewThreadSelector:@selector(createOne:) toTarget:self withObject:n];
四,怎样取消线程,退出线程
线程退出3种情况
1> 线程的执行体执行结束
2> 线程的执行出错
3>手动退出线程
五,线程的优先级(线程执行顺序,影响执行频率)
优先级的值在0~1之间
默认0.5
值越大,线程执行的概率越高(并不是执行率越高)
六,线程锁
多线程在修改同一个资源时,会出现问题,解决这个问题的方法 通常是给线程加锁
线程加锁有三种方式
1> @synchronized(self){代码块}
2> //加锁(必须初始化)
[_myLock lock];
代码块
//解锁
[_myLock unlock];
3> //加锁(必须初始化)
[_conditionLock lock];
代码块
//解锁
[_conditionLock unlock];
2.NSoperation
首先需要创建 NSOperationQueue 队列
一, NSInvocationOperation
initWithTarget:self selector:@selector(threadOne:) object:n
//添加到队列里
[queue addOperation:op1];
二, NSBlockOperation
+ (instancetype)blockOperationWithBlock:(void(^)(void)block;
三,自己实现
1> 首先继承与 NSOPeration 创建一个类,实现父类里面的main方法
2> 创建一个队列(NSoperationQueue对象),创建imageOperation 对象,添加到队列里面
day10 多线程二
一, block
二,GCD
//主线程所在的串行队列
//全局的并行队列
//自己创建的串行队列和并行队列
//异步和同步的方式创建线程
dispatch_async(dispatch_queue_t queue ,void (^block)(void));
dispatch_sync(dispatch_queue_t queue ,void (^block)(void));