3.1.1 什么是GCD?
GCD是异步执行任务的技术之一。
开发者把想执行的任务追加到适当的队列中,GCD就能生成线程并计划执行任务。
线程管理是作为系统的一部分来实现,所以可统一管理,也可执行任务,比之前的线程,如NSThread,更有效率。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
/* 异步执行 */
dispatch_async(dispatch_get_main_queue(), ^{
/* 主线程执行 */
});
});
performSelector系多线程常用方法
- (void)doWork
{
[self performSelectorInBackground:@selector(doSomeThingInBanckGround) withObject:nil];
}
- (void)doSomeThingInBanckGround
{
/* 异步执行 */
[self performSelectorOnMainThread:@selector(doSomeThingInMainThread) withObject:nil waitUntilDone:NO];
}
- (void)doSomeThingInMainThread
{
/* 主线程执行 */
}
perfromSelector系多线程其他一些方法
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array;
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array;
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg;
- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg;
3.1.2 多线程编程(利用多线程编程的技术)
问题一、线程是什么?
条件:一个CPU一次只能执行一个命令,不能执行某处分开的并列的两个命令,所以CPU执行的CPU命令列就好比一条无分叉的大道,执行不会出现分叉。
“一个CPU执行的CPU命令列为一条无分叉路径”,即为“线程”。
问题二、多线程是什么?
条件:现在一个物理CPU芯片实际有64个(64核)CPU,一个CPU核可以虚拟两个CPU核工作。所以可以使用多个CPU核,但“一个CPU执行的CPU命令列为一条无分叉路径”不变。
同时存在多条无分叉路径,即为多线程。在多线程中,一个CPU核执行多条不同路径上的不同命令。(通过下面要讲的上下文)。
问题三、一个CPU核一次只能执行一个CPU命令,怎样实现在多条路径中执行CPU命令?
上下文切换:iOS、OS X内核在发生系统事件时,会切换执行路径。在执行中的路径的状态,如CPU的寄存器等信息保存到各自路径专用的内存块中,从切换目标路径的专用内存中,复原CPU寄存器等信息,继续执行切换路径(切换到的目标路径)的CPU命令列。
一个CPU:使用多线程的程序是在某个线程和其他线程之前反复进行上下文切换,看上去并列执行多线程一样。
多个CPU:真的提供多个CPU核并行执行多个线程。
问题四、多线程编程的问题?
1、多个线程同时更新一个相同的资源会导致数据的不一致,(数据竞争)
2、多个线程相互等待,(死锁)
3、使用太多线程会消耗大量内存
问题五、使用多线程编程的原因?
使用多线程编程可保证应用程序的响应性能。
在主线程进行长时间的处理,会妨碍主线程中被称为RunLoop的主循环的执行,导致不能更新用户界面,应用程序的画面长时间停滞等问题。
问题六、多线程编程优点?
1、使用多线程编程,在执行长时间的处理仍可保证应用程序的响应性能。
2、GCD大大简化复杂的多线程编程的源代码。
网友评论