IT@程序员猿媛移动开发干货店码农的世界

IOS开发多线程讲解(二)

2019-05-01  本文已影响22人  星辰_入海
小编专题欢迎加入

大家五一快乐,劳动节,让我们劳动一下!上文提及多线程的引入,以及多线程的dispatch_async(dispatch_get_main_queue,^{});的使用,今天我们继续进入多线程的学习

一.dispatch_queue_create
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是为了防止多个线程更新相同资源而导致数据竞争使用Serial Dispatch Queuea 图2--数据竞争

解决使用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_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);   
总结:本文讲述了dispatch_queue_create的使用方法,需要注意的是其中的返回值为dispatch_queue_t,同时,程序员需要自己释放自己生成的线程,同时,注意生成Serial Dispatch Queue and Concurrent Dispatch Queue的方法.下文,我们将讲述关于常用的线程的其它使用方法,其次,五一过后,我们继续进入视图控件的学习--以及对于小编自己写的一个DEMO进行讲解。
上一篇下一篇

猜你喜欢

热点阅读