美文网首页
多线程汇总

多线程汇总

作者: 冰山_X | 来源:发表于2021-06-15 10:28 被阅读0次

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,耗费性能

相关文章

网友评论

      本文标题:多线程汇总

      本文链接:https://www.haomeiwen.com/subject/aaiasltx.html