IOS-多线程

  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)textSelfMode
118 {
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)showThreadInfo
138 {
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      NSThread
175      创建线程,执行线程,关闭线程,在线程中发布指令
176      缺点:繁琐,不利于使用
177      优点:逻辑简单,浅显易懂
178      
179      NSOperationQueue
180      (1)NSStackQueue NSBlockQueue
181      (2)NSOperation
182      优点:免去了程序员创建线程,管理数据调度等操作,只要程序员发布指令即可
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 Queue
196      
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 }
原文地址:https://www.cnblogs.com/oc-bowen/p/5121443.html