1 常用多线程有哪几种?他们的区别是什么?
NSThread
创建/启动线程
- NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];[thread start];
- [NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
- [self performSelectorInBackground:@selector(run) withObject:nil];
NSOperation
优点:
- 可添加完成的代码块,在操作完成后执行
- 添加操作之间的依赖关系,方便的控制执行顺序
- 设定操作执行的优先级
- 可以很方便的取消一个操作的执行
- 使用KVO对操作执行状态的更改isExecuteing、isFinished、isCancelled
可操作分类
- NSInvocationOperation
- NSBlockOperation
addExecutionBlock - 自定义NSOperation子类
重写main方法
NSOperationQueue
两种队列
- MainQueue
*NSOperationQueue queue = [NSOperationQueue mainQueue] - CustomQueue
*NSOperationQueue queue = [[NSOperationQueue alloc] init]
添加队列
- (void)addOperation:(NSOperation *)op
- (void)addOperationWithBlock:(void (^)(void))block
控制串行/并发
- maxConcurrentOperationCount
default = -1 不限制并发量
== 1: 并发量为1,串行
> 1:并发执行
添加依赖
- (void)addDependency:(NSOperation *)op; 添加依赖,使当前操作依赖于操作 op 的完成。
- (void)removeDependency:(NSOperation *)op; 移除依赖,取消当前操作对操作 op 的依赖。
NSOperation 优先级
- setQueuePriority
线程安全
- 给线程加锁,在一个线程执行该操作的时候,不允许其他线程进行操作
GCD
以上三种多线程的区别:
- NSThread管理多条线程比较困难
- NSThread适用于获取当前线程[NSThread current]
- NSOperation是GCD封装的oc的API,面向对象
- 如果有依赖关系,使用NSOperation
- 如果需要监听任务完成状态,使用NSOperation
2 线程与进程的区别?
- 线程是进程中的一个独立的执行路径(控制单元)
- 一个进程中至少包含一条线程
3 创建一条线程耗费的时间跟空间分别是多少?
4 多线程的应用场景?
5 线程池的原理?
6 线程安全?
- @synchronized代码块
- 使用NSLock同步锁
7 串行,并行,同步,异步的区别?
8 线程的死锁有哪些?
- 主线程中追加同步代码导致死锁
因为在主线程中正在执行这些源代码,所以无法执行追加到主线程队列中的block
let queue = DispatchQueue.main
queue.sync {
print("hello world")
}
let queue = DispatchQueue.main
queue.async {
queue.sync {
print("hello world")
}
}
9 nonatomic和atomic的区分?
- 非原子性与原子性
- atomic相当于给set方法加了锁,线程安全
- 如果没有多线程操作就不需使用atomic,耗费性能
网友评论