zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    学习ASP.NET Web API框架揭秘之“HTTP方法重写”
    学习、摘录、目标——学习任务
    ASP.NET Core学习零散记录
    通过Nginx实现负载均衡
    通过IIS共享文件夹来实现静态资源"本地分布式"部署
    python2.7 django 错误汇总
    【心得】算法练习
    【数据结构】思维导图
    【算法】思维导图
    记录一次面试中二分查找的算法题
  • 原文地址:https://www.cnblogs.com/oc-bowen/p/5121443.html
Copyright © 2011-2022 走看看