1 // ViewController.m 2 // IOS_0111_多线程 3 // 4 // Created by ma c on 16/1/11. 5 // Copyright (c) 2016年 博文科技. All rights reserved. 6 // 7 8 #import "ViewController.h" 9 10 @interface ViewController () 11 12 @end 13 14 @implementation ViewController 15 16 - (void)viewDidLoad { 17 [super viewDidLoad]; 18 19 // [self textTongBu]; 20 // [self textYiBu]; 21 // [self textSelfMode]; 22 // [self testGroup]; 23 24 25 //在主队列中刷新 26 //在某个block当中的代码的确被执行了,但是在界面中没有效果,这时可以考虑在主队列中执行block中的代码 27 // [self testMainQueueRefresh]; 28 29 //延时操作 30 [self testDelay]; 31 } 32 #pragma mark - 延时操作 33 - (void)testDelay 34 { 35 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 36 NSLog(@"延迟4s执行"); 37 }); 38 } 39 40 #pragma mark - 主队列中刷新 41 - (void)testMainQueueRefresh 42 { 43 void (^block)(void) = ^{ 44 45 //NSLog(@"请求了大量的数据,记载在表格中"); 46 //出现了一个问题,数据请求完毕了,但是没有加载在表格中 47 48 dispatch_async(dispatch_get_main_queue(), ^{ 49 //在这里执行的指令,相当于在主线程中执行 50 NSLog(@"请求了大量的数据,记载在表格中"); 51 }); 52 }; 53 block(); 54 55 56 } 57 #pragma mark - 测试队列组的顺序激发 58 - (void)testGroup 59 { 60 //在队列组中,指令的执行顺序由程序员控制 61 dispatch_group_t group = dispatch_group_create(); 62 63 dispatch_queue_t queue = dispatch_queue_create("www.bowen.com", DISPATCH_QUEUE_CONCURRENT); 64 dispatch_group_async(group, queue, ^{ 65 NSLog(@"执行事件1"); 66 }); 67 dispatch_group_async(group, queue, ^{ 68 NSLog(@"执行事件2"); 69 }); dispatch_group_async(group, queue, ^{ 70 NSLog(@"执行事件3"); 71 }); 72 dispatch_group_notify(group, queue, ^{ 73 NSLog(@"最后执行"); 74 }); 75 } 76 77 #pragma mark - 线程测试 78 //测试同步线程中,指令的执行过程 79 - (void)textTongBu 80 { 81 //在主线程中执行 82 dispatch_async(dispatch_get_main_queue(), ^{ 83 NSLog(@"在线程中要做某事1"); 84 }); 85 dispatch_async(dispatch_get_main_queue(), ^{ 86 NSLog(@"在线程中要做某事2"); 87 }); 88 dispatch_async(dispatch_get_main_queue(), ^{ 89 NSLog(@"在线程中要做某事3"); 90 }); 91 dispatch_async(dispatch_get_main_queue(), ^{ 92 NSLog(@"在线程中要做某事4"); 93 }); 94 } 95 //测试异步线程中,指令的执行过程 96 - (void)textYiBu 97 { 98 //第一个参数:表示队列的类型 99 //第二个参数:100 dispatch_queue_t queue =101 dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);102 103 dispatch_async(queue, ^{104 NSLog(@"在线程中要做某事1");105 });106 dispatch_async(queue, ^{107 NSLog(@"在线程中要做某事2");108 });109 dispatch_async(queue, ^{110 NSLog(@"在线程中要做某事3");111 });112 dispatch_async(queue, ^{113 NSLog(@"在线程中要做某事4");114 });115 }116 //自定义队列117 - (void)textSelfMode118 {119 //第一个参数:字符串标志120 //第二个参数:队列属性121 dispatch_queue_t customQueue = dispatch_queue_create("www.bowen.com", DISPATCH_QUEUE_CONCURRENT);122 dispatch_async(customQueue, ^{123 NSLog(@"在线程中要做某事1");124 });125 dispatch_async(customQueue, ^{126 NSLog(@"在线程中要做某事2");127 }); dispatch_async(customQueue, ^{128 NSLog(@"在线程中要做某事3");129 });130 dispatch_async(customQueue, ^{131 NSLog(@"在线程中要做某事4");132 });133 }134 135 #pragma mark - 线程的基础知识136 137 - (void)showThreadInfo138 {139 /*140 1.什么是线程?线程与进程区别?141 线程:thread - 程序执行流的最小基本单元142 进程:process - 一个进程就是一个程序143 一个线程就是在一个程序中完成一个任务的链144 一个进程可以有多个线程(进程包含线程)145 ps:如果一个进程只有一个线程,这个线程就是当前程序146 pss:在一个程序中使用多个线程完成不同的任务的操作,叫做多线程147 psss:线程被放置在线程队列(FIFO)中,在GCD中,叫dispatch queue,保证先进来的线程优先得到执行148 149 线程并不是一直都在执行的 - 非线性的不连续状态150 线程的三种状态:[就绪] [运行] [阻塞]151 就绪:线程的各个被执行的逻辑条件都满足,逻辑上能执行,等待[处理机]调度执行152 运行:处理机正在处理线程153 阻塞:等待逻辑条件都被满足,等待的是指令(函数、block),逻辑上不能运行154 155 2.多线程的实现方式有几种?156 线程实现方式:157 串行:线程中的任务想要执行必须等待[上一个任务]完成158 并行:线程中的任务想要执行必须等待[上一个任务]开始159 同步:线程的执行时间与主线程同步160 异步:线程的执行时间与主线程不同步161 162 同步串行:在一个与主线程同步的线程中,同步执行任务163 ps:在计算机中除了主线程外,其余线程都是并行性质164 异步串行:在与一个主线程不同步的线程中,异步执行任务165 166 同步并行:线程中多个任务同时向前推进167 异步并行:线程中多个任务同时进行,但完成度不同168 169 3.IOS中多线程的实现方式170 NSThread 线程操作171 Cocoa NSOperation + NSOperationQueue 线程管理172 GCD(Grand Center Dispatch) 中央队列处理173 174 NSThread175 创建线程,执行线程,关闭线程,在线程中发布指令176 缺点:繁琐,不利于使用177 优点:逻辑简单,浅显易懂178 179 NSOperationQueue180 (1)NSStackQueue NSBlockQueue181 (2)NSOperation182 优点:免去了程序员创建线程,管理数据调度等操作,只要程序员发布指令即可183 缺点:太繁琐,由于实现方式不同,不便于代码的管理和功能的调和184 185 GCD(Grand Center Dispatch)186 缺点:由于实现简单造成的抽象性太强,不便于理解187 优点:程序员不用再管理线程188 189 4.什么是GCD-集中式中央队列处理190 Mac OSX 6.0 +Xcode4.0 引进GCD[集中式中央队列处理]191 192 在gcd中,程序员操作的东西队列,队列组193 好处:解决了线程操作的繁琐,队列管理十分简单194 195 FIFO -> disPatch Queue196 197 5.GCD队列类型有几种198 主队列:199 后台队列:200 高优先级队列:201 低优先级队列:202 默认优先级队列:203 204 6.GCD中队列的执行方式有几种205 同步、异步206 ps:坚决不能在主队列中开启同步队列,因为会造成主队列死锁207 208 7.线程基本操作209 获取主队列 - dispatch_get_main_queue()210 //异步加载211 dispatch_async(dispatch_get_main_queue(), ^{212 NSLog(@"在一个主线程中做某些事");213 [tableView reloadData];214 });215 216 开启新队列217 dispatch_queue_t queue = dispatch_queue_create(const char *label, dispatch_queue_attr_t attr)218 (1)开启同步队列219 dispatch_sync(dispatch_queue_t queue, <#^(void)block#>)220 第一个参数:开启的队列221 第二个参数:队列中要执行的命令222 223 (2)开启异步队列224 dispatch_async(dispatch_queue_t queue, <#^(void)block#>)225 226 //所有刷新UI的操作都必须在主线程中执行227 228 */229 230 }231 232 - (void)didReceiveMemoryWarning {233 [super didReceiveMemoryWarning];234 // Dispose of any resources that can be recreated.235 }236 237 @end
1 + (Globle *)shareGloble 2 { 3 static dispatch_once_t onceToken; 4 dispatch_once(&onceToken, ^{ 5 globle = [[Globle alloc] init]; 6 globle.userId = @""; 7 }); 8 9 return globle;10 }