首先讲一下什么是线程,线程是系统调度的最小单位,进程是CPU分配资源的最小单位,通常情况下每个APP对应一个进程,当界面刚显示出来的时候,默认进程中的主线程已经启动。
线程跟进程在CPU中的区别
线程的内存在进程中是共享的,进程的内存在CPU中是独立的
再讲解一下基本的概念
同步:任务在同一个线程中执行
异步:任务在不同的线程中执行
主线成:UI视图,通常用作UI的更新以及显示,当出现同步任务时候,如果延时任务都在主线程中,会造成卡顿。
子线程:为了缓解UI视图的压力,通常将延时操作放在子线程中,主线成不会造成卡顿。
串行:任务一个一个按照顺序执行
并行:任务同时进行
GCD是苹果推出的多线程方案,整体API使用C语言调用。线程的生命周期由GCD控制,比如线程的创建,任务的调度,线程的销毁。
dispatch_group_t group = dispatch_group_create(); dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_group_enter(group); dispatch_group_async(group, queue, ^{ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ NSLog(@"1"); dispatch_group_leave(group); }); }); dispatch_group_enter(group); dispatch_group_async(group, queue, ^{ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ NSLog(@"2"); dispatch_group_leave(group); }); }); dispatch_group_notify(group, queue, ^{ NSLog(@"结束"); });
当需要处理多条网络请求可以使用线程组的方式,在任务执行前需要有dispatch_group_enter,在任务执行玩的时候,需要用dispatch_group_leave结束任务,有多少个dispatch_group_enter就需要有多少个dispatch_group_leave。
创建串行队列
dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
创建并行队列
dispatch_queue_t conCurrentQueue = dispatch_queue_create("conCurrentQueue", DISPATCH_QUEUE_SERIAL);
创建同步任务
dispatch_sync(<#dispatch_queue_t _Nonnull queue#>, <#^(void)block#>)
创建异步任务
dispatch_async(<#dispatch_queue_t _Nonnull queue#>, <#^(void)block#>)
信号量
线程间的通信
NSThread版本
[self performSelector:<#(nonnull SEL)#> onThread:<#(nonnull NSThread *)#> withObject:<#(nullable id)#> waitUntilDone:<#(BOOL)#>];
GCD版本
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_queue_t mainQueue = dispatch_get_main_queue(); dispatch_async(globalQueue, ^{ NSLog(@"子线程处理耗时任务"); dispatch_async(mainQueue, ^{ NSLog(@"子线程回到主线成"); }); });