iOS 多线程的概念、原理

2019-03-12  本文已影响0人  尤先森
图1.png

线程和进程的关系和区别

线程定义
进程定义
进程与线程的区别

多线程的意义

优点

缺点

好像主线程也是512KB,而不是1MB

多线程的原理
图3.png
多线程的生命周期
图4.png

CPU如何调度线程?线程池的原理

图5-线程池参数.png
图6-线程池的原理.png
1.系统有一个可调度线程池,如果线程池里有这个线程,就会开始执行。
2.如果没有,将判断线程池大小是否小于核心线程池大小,如果小于,那将会开辟新的线程来执行任务。
3.如果大于线程池,代表线程池没有能力再去开辟新的线程,只能依赖于原有的线程去执行 ,就将判断工作队列是否已满,如果没满就将任务提交到工作队列,等待执行任务。
4.满了的话,线程池就会判断所有线程是否都在工作,如果有空闲的线程,就让这条线程去执行任务。
5.如果还是没有空闲的线程,就将任务交给饱和策略
6.饱和策略分为四种

Abort策略:默认策略,新任务提交时直接抛出未检查的异常RejectedExecutionException,该异常可由调用者捕获。
CallerRuns策略:为调节机制,既不抛弃任务也不抛出异常,而是将某些任务回退到调用者。不会在线程池的线程中执行新的任务,而是在调用exector的线程中运行新的任务。
Discard策略:新提交的任务被抛弃。
DiscardOldest策略:队列的是“队头”的任务,然后尝试提交新的任务。(不适合工作队列为优先队列场景)

线程操作

查看NSThread相关文件可以看到,线程有多种状态,可以根据不同情况,判断线程的状态,来做不同的操作。可通过重写下面的方法掌握线程的生命周期(YYKit)。
一般情况下,我们很少去中止一个网络请求,按照一般的情况,是没办法中止的,但是依靠线程,通过关闭线程,从而达到中止网络请求的目的。

@property (readonly, getter=isExecuting) BOOL executing API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
@property (readonly, getter=isFinished) BOOL finished API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
@property (readonly, getter=isCancelled) BOOL cancelled API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));

- (void)cancel API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
- (void)start API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
- (void)main API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0)); // thread body method

线程安全

这是一张经典的多线程比喻图。多端增删改查。


图7.png

如何避免上图的情况?如何保证线程安全?
上锁

上一篇 下一篇

猜你喜欢

热点阅读