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 }
  • 相关阅读:
    centos 安装 TortoiseSVN svn 客户端
    linux 定时任务 日志记录
    centos6.5 安装PHP7.0支持nginx
    linux root 用户 定时任务添加
    composer 一些使用说明
    laravel cookie写入
    laravel composer 安装指定版本以及基本的配置
    mysql 删除重复记录语句
    linux php redis 扩展安装
    linux php 安装 memcache 扩展
  • 原文地址:https://www.cnblogs.com/oc-bowen/p/5121443.html
Copyright © 2011-2022 走看看