IOS开发多线程讲解(二)
2019-05-01 本文已影响22人
星辰_入海
小编专题欢迎加入
大家五一快乐,劳动节,让我们劳动一下!上文提及多线程的引入,以及多线程的dispatch_async(dispatch_get_main_queue,^{});的使用,今天我们继续进入多线程的学习
一.dispatch_queue_create
- 通过dispatch_queue_create函数可以生成Dispatch Queue
dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("com.example.gcd.MySerialDispatchQueue",NULL);
解析:在讲解dispatch_queue_create之前,我们可以观察到MySerialDispatchQueue中的Serial Dispatch Queue和上一节讲解的内容是一样的(https://www.jianshu.com/p/b1e6be5cd2fe),通过上一回内容,我们可以了解到Serial Dispatch Queue and Concurrent Dispatch Queue的使用
- Serial Dispatch Queue
执行一个线程任务,当一个线程任务结束后,便可以执行下一个任务
- Concurrent Dispatch Queue
执行多个线程任务,在执行A的同时,可以申请执行B的任务,以此循环往复,知道所有任务全部被执行
虽然我们发现Serial Dispatch Queue and Concurrent Dispatch Queue 都受到了系统资源的限制,但是使用dispatch_queue_create可以生成多个Serial Dispatch Queue,同时让每个Serial Dispatch Queue并行执行 图1--多个Serial Dispatch Queue
[使用dispatch_create创建4个Serial Dispatch Queue线程,虽然每一个Serial Dispatch Queue执行一个线程,但是这4个Serial Dispatch Queue属于并发执行]
虽然,可以使用这样的方式来创建多个线程,但是这无疑会增加内存的巨大消耗,从而引起大量的 上下文切换,导致大幅度降低系统的响应性能
解决使用Serial Dispatch Queue 图3--Serial Dispatch Queue
当想要执行并发同时不发生数据竞争等问题时候,我们也可以使用Concurrent Dispatch Queue,对于Concurrent Dispatch Queue来说不论生成多少个,由于XNU内核只使用有效管理的线程,因此不会发生Serial Dispatch Queue的问题
好啦,回到最初的分析问题上来,对于dispatch_queue_create的解析
dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("com.example.gcd.MySerialDispatchQueue",NULL);
dispatch_queue_create接收的第一个参数是使用应用程序ID逆序全名程域名
- 当dispatch_queue_create想要生成Serial Dispatch Queue时候,第二个参数使用NULL
- 当dispatch_queue_create想要生成Concurrent Dispatch Queue时候,第二个参数使用DISPATCH_QUEUE_CONCURRENT
dispatch_queue_t myConcurrentDispatchQueue = dispatch_queue_create("com.example.gcd.MySerialDispatchQueue",DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_create的返回值类型为dispat_queue_t类型
dispatch_queue_t myConcurrentDispatchQueue = dispatch_queue_create("com.example.gcd.MySerialDispatchQueue",DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_async(myConcurrentDispatchQueue,^{
NSLog(@"This my Concurrent Dispatch Queue");
});
虽然,在Xcode中我们有ARC自动释放内存,但是对于我们自己创建的线程需要自己来释放
dispatch_release(myConcurrentDispatchQueue);
dispatch_release(mySerialDispatchQueue);