1.PThread : 是一个C语言的一个API接口,由于使用难度较大,较为底层。我们在平常开发的时候不经常使用!
2.NSThread: 是三种方法里面相对轻量级的,但需要管理线程的生命周期、同步、加锁问题,这会导致一定的性能开销
3.NSOperation: 是基于OC实现的,NSOperation以面向对象的方式封装了需要执行的操作,不必关心线程管理、同步等问题。NSOperation是一个抽象基类,iOS提供了两种默认实现:NSInvocationOperation和NSBlockOperation,当然也可以自定义NSOperation
4.GCD:提供了一些新特性、运行库来支持多核并行编程,它的关注点更高:如何在多个cpu上提升效率
下面主要介绍一些NSThread:
一
首先NSThread初始化方法:(动态方法)
``
1 - (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;
``
参数解析:
selector :线程执行的方法,这个selector最多只能接收一个参数
target :selector消息发送的对象
argument : 传给selector的唯一参数,也可以是nil
2初始化方法(静态方法)
2 + (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;
3 [NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil]; // 调用完毕后,会马上创建并开启新线程
- 隐式创建线程的方法
``
4 [self performSelectorInBackground:@selector(run) withObject:nil];
``
二
获取当前线程
5 NSThread *current = [NSThread currentThread];
三
获取主线程
6 NSThread *main = [NSThread mainThread];
四
暂停线程
// 暂停2s [NSThread sleepForTimeInterval:2]; // 或者 NSDate *date = [NSDate dateWithTimeInterval:2 sinceDate:[NSDate date]]; [NSThread sleepUntilDate:date];
五
线程间的通信
- 在指定线程上执行操作
[self performSelector:@selector(run) onThread:thread withObject:nil waitUntilDone:YES];
- 在主线程上进行操作
[self performSelectorOnMainThread:@selector(run) withObject:nil waitUntilDone:YES];
- 在当前线程执行操作
7 [self performSelector:@selector(run) withObject:nil];
六
优缺点
1.优点:NSThread比其他两种多线程方案较轻量级,更直观地控制线程对象
2.缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销
补充一点就是:NSThread有哪几种状态,和转换的逻辑
新建->就绪-> cup调度当前任务->运行->阻塞->死亡->CUP调度其他任务->就绪
主线程的一些概念:
默认启动的线程,也叫作UI线程,用来显示和刷新UI界面,和处理一些UI事件的。 需要注意的是:不要把耗时操作放到主线程上去做!UI操作必须在主线程中执行 !!!!
说一说如何解决多条线程访问同一块资源造成的线程安全的问题,以及一些注意点!
加同步(互斥)锁 @synchronized OC中的同步锁:(锁对象) + {要锁住的代码} 锁对象:要求是全局唯一的属性 注意点: 要注意加锁的位置 加锁需要耗费性能,因此需要注意加锁的条件(多线程访问同一块资源) 专业术语:线程同步
原子和非原子属性的区别
atomic:原子属性,会为setter方法默认加锁,线程是安全的,但是会消耗大量资源! noatomic:非原子属性,不会为setter方法加锁。非线程安全,适合内存小的移动设备。