多线程(三)
2016-05-07 19:26
435 查看
下面主要介绍一下GCD(Grand Central Dispatch)的一般用法,理解好的话对以后的多线程开发是非常有帮助的。
个人认为GCD有两大优点
优点一、自动管理线程的生命周期(创建、调度、销毁)
优点二、合理利用CPU内核,达到物尽其用。
核心概念
概念一、任务:执行什么操作 (dispatch_sync:同步,不具备开启线程的能力 dispatch_async: 异步,具备开启线程的能力)
概念二、队列:存放任务(并发队列:多个任务可以同时执行 串行队列:一个任务执行完毕后,再执行下一个任务)
其实,我们但凡用到多线程都希望其具备开启线程的能力,并且不在主线程中操作。(纯属个人理解)一般会用到下面几种方法。
下面的方法偶尔会用到
/** * async -- 串行队列(有时候用) * 会不会创建线程:会,一般只开1条线程 * 任务的执行方式:串行执行(一个任务执行完毕后再执行下一个任务) */ - (void)asyncSerialQueue { // 1.创建一个串行队列 dispatch_queue_t queue = dispatch_queue_create("queue", NULL); // 2.将任务添加到串行队列中 异步 执行 dispatch_async(queue, ^{ NSLog(@"-----下载图片1---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"-----下载图片2---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"-----下载图片3---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"-----下载图片4---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"-----下载图片5---%@", [NSThread currentThread]); }); }
下面方法常用
/** * async -- 主队列(很常用) */ - (void)asyncMainQueue { // 1.主队列(添加到主队列中的任务,都会自动放到主线程中去执行) dispatch_queue_t queue = dispatch_get_main_queue(); // 2.添加 任务 到主队列中 异步 执行 dispatch_async(queue, ^{ NSLog(@"-----下载图片1---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"-----下载图片2---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"-----下载图片3---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"-----下载图片4---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"-----下载图片5---%@", [NSThread currentThread]); }); }
下面方法最常用,(如我的想法理解一样)
/** * async -- 并发队列(最常用) * 会不会创建线程:会,一般同时开多条 * 任务的执行方式:并发执行 */ - (void)asyncGlobalQueue { // 获得全局的并发队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 将 任务 添加 全局队列 中去 异步 执行 dispatch_async(queue, ^{ NSLog(@"-----下载图片1---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"-----下载图片2---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"-----下载图片3---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"-----下载图片4---%@", [NSThread currentThread]); }); dispatch_async(queue, ^{ NSLog(@"-----下载图片5---%@", [NSThread currentThread]); }); }
相关文章推荐
- Android中常见的XML解析方式
- iOS Masonry介绍与使用
- Objective-C:内存管理
- Android基础知识点总结
- linux运维学习决心书
- Android Calender显示日期与时间
- cqm解题报告02
- [Nutch]Solr配置自定义的中文分词器mmseg4j
- 把数组排成最小的数
- 浅析printf和scanf的返回之问题
- FL2440烧录 转
- hdu_3294_Girls' research(Manacher)
- sleep() 和 wait() 有什么区别?
- Cookie/Session机制详解
- hdu_3294_Girls' research(Manacher)
- 系统架构师成长之路(一)
- [LeetCode]050-Pow(x,n)
- Android之Camera介绍
- Class.forName()用法详解
- 【UNET自学日志】Part20 UI