IOS开发-多线程队列测试代码

直接贴测试代码了。

当前考虑的问题:
1.队列有多少个消费者
2.添加到队列的新task是同步运行(当前线程阻塞)还是异步(当前线程不阻塞)
3.多个队列之间的调度(此文章未涉及)

//
// 单线程和多线程并发队列测试(同步和异步)
//
// 基础原理:
// 1)队列:
//  1.1 dispatch_queue_t 是一个队列,一个FIFO的消费队列
//  1.2 消费者:队列配置的运行线程
//  1.3 被消费对象: 添加到队列中的运行任务(block等)
//  1.4 运行任务:将任务放到队列中,等待消费者消费
// 2)同步,异步  (对于任务) (此处的运行指将任务发入到请求队列中)
//  2.1 同步:A任务在运行时,插入B任务,A任务等待B任务运行完才能运行
//  2.2 异步: A任务在运行时,插入B任务,A任务不等待并且继续运行,B任务也运行
// 假设:
// ATask: 运行fooA的Block
// BTask: 运行fooB的Block
//
//
// 总结:
// 不管单线程或多线程,同步或异步,一定要联系请求队列考虑

#import "TestQueueSi.h"

@interface TestQueueSi ()

@property (strong,nonatomic) dispatch_queue_t serialQueue;
@property (strong,nonatomic) dispatch_queue_t concurrentQueue;

@end

@implementation TestQueueSi

- (instancetype)init {
  self = [super init];
  if(self) {
    _serialQueue = dispatch_queue_create("chenhh.serialQueue", DISPATCH_QUEUE_SERIAL);
    _concurrentQueue = dispatch_queue_create("chenhh.concurrentQueue", DISPATCH_QUEUE_CONCURRENT);

  }
  return self;
}

/**
 QUEUE_SERIAL(单线程) 同步
 死锁崩溃

 1.ATask运行,同步加入BTask
 2.BTask加入到请求队列中,可是没有其他空余线程(ATask线程在 等待BTask),BTask等待空余线程,
 3.死锁发生

 */
- (void)testSerialQueueSync {
  dispatch_sync(_serialQueue,^{
    [self fooA];
    dispatch_sync(_serialQueue,^{
       [self fooB];
    });
    [self fooA];
  });
}

/**
 QUEUE_CONCURRENT(多线程) 同步
 正常运行

 1.ATask运行,同步加入BTask,Atask线程等待
 2.BTask加入到请求队列中,有其他空余线程(ATask线程在等待BTask),BTask运行
 3.BTask运行结束,ATask停止等待,继续运行

 */
- (void)testConcurrentQueueSync {
  dispatch_sync(_concurrentQueue,^{
    [self fooA];
    NSLog(@"first");

    // 同步 需要等待运行结果
    dispatch_sync(_concurrentQueue,^{
      [self fooB];
    });

    // 等待同步代码完成,再运行
    [self fooA];
  });
}

/*
 QUEUE_SERIAL(单线程) 异步
 正常

 1.ATask运行,异步加入BTask,Atask线程继续运行不等待
 2.BTask加入到请求队列中,没有其他空余线程(ATask线程在正常运行),BTask等待空余
 3.ATask运行完成,线程空出,BTask运行

 */
- (void)testSerialQueueAsync {
  dispatch_async(_serialQueue,^{
    [self fooA];
    dispatch_async(_serialQueue,^{
      [self fooB];
    });
     [self fooA];
  });
}

/**
 QUEUE_CONCURRENT(多线程) 异步
 正常运行

 1.ATask运行,同步加入BTask,Atask线程继续运行不等待
 2.BTask加入到请求队列中,有其他空余线程(ATask等线程在正常运行),BTask运行(ABTask同时运行)

 */
- (void)testConcurrentQueueAsync {
  dispatch_async(_concurrentQueue,^{
    [self fooA];
    // 同步 需要等待运行结果
    dispatch_async(_concurrentQueue,^{
      [self fooB];
    });

    // 等待同步代码完成,再运行
    [self fooA];
  });
}

- (void)fooA {
  NSLog(@" ************ fooA ************ ");
}

- (void)fooB {
  NSLog(@" ************ fooB ************ ");
}

@end
(0)

相关推荐

  • IOS多线程实现多图片下载(二)

    上篇文章给大家介绍了IOS多线程实现多图片下载1,本文继续给大家介绍ios多线程下载图片. 这次是用多线程进行图片的下载与存储,而且考虑到下载失败,占位图片的问题(第一张就是下载失败的图片) 闲话少说,上代码吧,因为有一部分和上次的一样,所以这里只上传不一样的 先给大家展示下效果图: 依旧都是在ViewController.m中 1. @interface ViewController () //所有数据 @property (nonatomic,strong)NSArray *apps; //

  • 在IOS中为什么使用多线程及多线程实现的三种方法

    多线程是一个比较轻量级的方法来实现单个应用程序内多个代码执行路径. 在系统级别内,程序并排执行,程序分配到每个程序的执行时间是基于该程序的所需时间和其他程序的所需时间来决定的. 然而,在每个程序内部,存在一个或者多个执行线程,它同时或在一个几乎同时发生的方式里执行不同的任务. 概要提示: iPhone中的线程应用并不是无节制的,官方给出的资料显示,iPhone OS下的主线程的堆栈大小是1M,第二个线程开始就是512KB,并且该值不能通过编译器开关或线程API函数来更改,只有主线程有直接修改UI

  • IOS多线程实现多图片下载(一)

    在没有步入正文之前先给大家展示下效果图,如果大家觉得很满意请继续往下阅读全文. 大家可以看到这个界面很简单,其实就是UITableView的布局,但是难点是在于如何从网上下载这些图片,下载之后应如何进行存储! 我们一步一步进行解析,先从单线程(主线程)进行多图片下载我们布局上的文字及图片的地址从plist文件中进行读取 根据结构,我们自定义一个数据模型文件 DDZApp.h #import <Foundation/Foundation.h> @interface DDZApp : NSObje

  • IOS多线程编程的3种实现方法

    前言 在多线程简介中,我已经说明过了,为了提高界面的流畅度以及用户体验.我们务必要把耗时的操作放到别的线程中去执行,千万不要阻塞主线程. iOS中有以下3种多线程编程方法: NSThread Grand Centeral Dispatch(GCD) NSOperation和NSOperationQueue 1.NSThread 这是最轻量级的多线程的方法,使用起来最直观的多线程编程方法.但是因为需要自己管理线程的生命周期,线程同步.经常使用NSThread进行调试,在实际项目中不推荐使用. //

  • 详解iOS中多线程app开发的GCD队列的使用

    GCD的基本使用 一.主队列介绍 主队列:是和主线程相关联的队列,主队列是GCD自带的一种特殊的串行队列,放在主队列中得任务,都会放到主线程中执行. 提示:如果把任务放到主队列中进行处理,那么不论处理函数是异步的还是同步的都不会开启新的线程. 获取主队列的方式: 复制代码 代码如下: dispatch_queue_t queue=dispatch_get_main_queue(); (1)使用异步函数执行主队列中得任务,代码示例: 复制代码 代码如下: // //  YYViewControll

  • IOS开发-多线程队列测试代码

    直接贴测试代码了. 当前考虑的问题: 1.队列有多少个消费者 2.添加到队列的新task是同步运行(当前线程阻塞)还是异步(当前线程不阻塞) 3.多个队列之间的调度(此文章未涉及) // // 单线程和多线程并发队列测试(同步和异步) // // 基础原理: // 1)队列: // 1.1 dispatch_queue_t 是一个队列,一个FIFO的消费队列 // 1.2 消费者:队列配置的运行线程 // 1.3 被消费对象: 添加到队列中的运行任务(block等) // 1.4 运行任务:将任

  • iOS开发多线程下全局变量赋值崩溃原理详解

    目录 问题 Demo 崩溃原因 崩溃路径 验证方式 其它测试 问题 Demo 在多线程下同时给全局变量赋值时会发生崩溃: static NSObject *_instance; - (void)foo { _instance = [[NSObject alloc] init]; } 崩溃原因 如下为源码的汇编代码: Demo-iOS`-[ViewController foo]: 0x104e4e088 <+0>: stp x29, x30, [sp, #-0x10]! 0x104e4e08c

  • iOS开发探索多线程GCD队列示例详解

    目录 引言 进程与线程 1.进程的定义 2.线程的定义 3. 进程和线程的关系 4. 多线程 5. 时间片 6. 线程池 GCD 1.任务 2.队列 3.死锁 总结 引言 在iOS开发过程中,绕不开网络请求.下载图片之类的耗时操作,这些操作放在主线程中处理会造成卡顿现象,所以我们都是放在子线程进行处理,处理完成后再返回到主线程进行展示. 多线程贯穿了我们整个的开发过程,iOS的多线程操作有NSThread.GCD.NSOperation,其中我们最常用的就是GCD. 进程与线程 在了解GCD之前

  • iOS开发探索多线程GCD常用函数

    目录 正文 单例 栅栏函数 调度组 dispatch_group_t 信号量 dispatch_semaphore_t dispatch_source 总结 正文 前篇文章我们了解了GCD的任务的原理,接下来我们在探索一下GCD中我们开发常用的函数 单例 下面我们从源码中看一下我们创建单例的时候使用的dispatch_once,都做了什么,是通过什么操作保证全局唯一的 void dispatch_once(dispatch_once_t *val, dispatch_block_t block)

  • iOS开发探索多线程GCD任务示例详解

    目录 引言 同步任务 死锁 异步任务 总结 引言 在上一篇文章中,我们探寻了队列是怎么创建的,串行队列和并发队列之间的区别,接下来我们在探寻一下GCD的另一个核心 - 任务 同步任务 void dispatch_sync(dispatch_queue_t queue, DISPATCH_NOESCAPE dispatch_block_t block); 我们先通过lldb查看其堆栈信息,分别查看其正常运行和死锁状态的信息 我们再通过源码查询其实现 #define _dispatch_Block_

  • IOS开发之多线程NSThiread GCD NSOperation Runloop

    IOS中的进程和线程 通长来说一个app就是一个进程 ios开发中较少的运用进程间的通信(XPC),绝大多数使用线程. 在ios开发中,为了保证流畅性以及线程安全,所有与UI相关的操作都应该放在主线程,所以有时候主线程也叫UI线程. 影响UI体验,耗时时间较长的操作,尽量放到非主线程中.比如网络请求以及和本地的IO操作. 在IOS开发中有关于多线程的知识点主要包括:NSThread.GCD.NSOperation和Runloop NSThread NSthread就是一个线程,它的底层是对pth

  • IOS开发OC代码中创建Swift编写的视图控制器

    IOS开发OC代码中创建Swift编写的视图控制器 背景 近日在和一群朋友做项目,我和另一位同学负责iOS客户端,我是一直使用OC的,而他只会Swift,因此在我们分工协作之后,就需要把代码合在一起,这就牵扯到如何在TabbarController中添加一个swift创建的子控制器的问题. 解决 首先在一个OC项目中新建一个Swift类,继承自UITableViewController,并且修改其view背景色,方便后续测试. import UIKit class ESSwiftTableVie

  • IOS开发之为视图绘制单(多)个圆角实例代码

    IOS开发之为视图绘制单(多)个圆角实例代码 前言: 为视图绘制圆角,圆角可以选左上角.左下角.右下角.右上角.全部圆角 //Core Raduias UIView *actionView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 200, 200)]; UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:actionView.bounds byRoundingCo

  • IOS开发 UIAlertController详解及实例代码

     IOS开发 UIAlertController详解 在iOS 8.0后,苹果弃用了UIAlertView和UIActionSheet,转而使用UIAlertController把之前的UIAlertView和UIActionSheet整合在一起.新版的API变得简洁了不少几行代码就可实现之前一大片代码的功能 UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"My Alert" messag

  • iOS开发之隐藏导航栏线的简单代码

    去除navigationBar上那条线: ///隐藏navigationBar导航栏线(直接写在UINavigationController-viewDidLoad方法里面即可) UIView *backgroundView = [self.navigationBar subviews].firstObject; _lineView = backgroundView.subviews.firstObject; _lineView.hidden = YES; 去除前(效果图): 去除后(效果图):

随机推荐