文档章节

第01天多线程网络:(14):主队列的相关用法

宇鸿165
 宇鸿165
发布于 2017/04/17 10:10
字数 1154
阅读 5
收藏 0

#####一、主队列的相关用法 注意点:同步函数 + 主队列 (产生死锁)

>>>一、并发队列
 使用 dispatch_queue_create 函数创建队列
 dispatch_queue_t
 dispatch_queue_create(队列名称, 队列的类型(并发、串行))

 创建并发队列
 dispatch_queue_t queue = dispatch_queue_create("com.lyh.queue", DISPATCH_QUEUE_CONCURRENT);
 
 >>>
 GCD默认已经提供了全局的并发队列,供整个应用使用,可以无需手动创建
 使用 dispatch_get_global_queue(队列的优先级, 此参数暂时无效,用0即可)函数获取全局的并发队列

 获取全局并发队列
 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
 
 全局并发队列的优先级
 #define DISPATCH_QUEUE_PRIORITY_HIGH 2                     // 高
 #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0                  // 默认(中)
 #define DISPATCH_QUEUE_PRIORITY_LOW (-2)                   // 低
 #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN       // 后台
 
 >>>二、串行队列
 GCD 获取串行有2种途径
 使用dispatch_queue_create函数创建串行队列
 // 创建串行队列 (队列类型传递NULL或者DISPATCH_QUEUE_SERIAL)
 dispatch_queue_create("com.lyh.queue", DISPATCH_QUEUE_SERIAL);

 使用主队列(跟主线程相关联的队列)
 主队列是GCD自带的一种特殊的串行队列
 放到主队列的任务,都会放到主线程中执行
 dispatch_get_main_queue() 获得主队列
 
 >>>三、各个队列的执行效果

#####二、异步函数 + 主队列同步函数 + 主队列 (产生死锁)

  • 1.异步函数 + 主队列
#pragma mark 一、 异步函数 + 主队列
// 所有任务都会在主线程中执行,不会开现场, 任务是串行执行
- (void)asyncMain
{
    // 1.获取主队列
    dispatch_queue_t mainQueue =  dispatch_get_main_queue();
    
    // 2.封装任务,将任务添加到队列里面
    // 异步函数
    dispatch_async(mainQueue, ^{
        NSLog(@"download1 -- %@",[NSThread currentThread]);
    });
    dispatch_async(mainQueue, ^{
        NSLog(@"download2 -- %@",[NSThread currentThread]);
    });
    dispatch_async(mainQueue, ^{
        NSLog(@"download3 -- %@",[NSThread currentThread]);
    });
}
  • 2.同步函数 + 主队列 (产生死锁)
#pragma mark 二、 同步函数 + 主队列 (产生死锁)
/**
 主队列的特点: 如果主队列发现当前主线程有任务在执行
             那么主队列会暂停调用队列中的任务,知道主线程空闲位置
 // 同步函数 : 立刻马上执行,如果我没有执行完毕,那么后面的也别想执行
 */

- (void)syncMain
{
    // 1.获取主队列
    dispatch_queue_t mainQueue =  dispatch_get_main_queue();
    
    NSLog(@"start");
    // 2.封装任务,将任务添加到队列里面
    // 同步函数 : 立刻马上执行,如果我没有执行完毕,那么后面的也别想执行
    dispatch_sync(mainQueue, ^{
        NSLog(@"download1 -- %@",[NSThread currentThread]);
    });
    dispatch_sync(mainQueue, ^{
        NSLog(@"download2 -- %@",[NSThread currentThread]);
    });
    dispatch_sync(mainQueue, ^{
        NSLog(@"download3 -- %@",[NSThread currentThread]);
    });
    
    NSLog(@"end");

}

code

/**
>>>一、并发队列
 使用 dispatch_queue_create 函数创建队列
 dispatch_queue_t
 dispatch_queue_create(队列名称, 队列的类型(并发、串行))

 创建并发队列
 dispatch_queue_t queue = dispatch_queue_create("com.lyh.queue", DISPATCH_QUEUE_CONCURRENT);
 
 >>>
 GCD默认已经提供了全局的并发队列,供整个应用使用,可以无需手动创建
 使用 dispatch_get_global_queue(队列的优先级, 此参数暂时无效,用0即可)函数获取全局的并发队列

 获取全局并发队列
 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
 
 全局并发队列的优先级
 #define DISPATCH_QUEUE_PRIORITY_HIGH 2                     // 高
 #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0                  // 默认(中)
 #define DISPATCH_QUEUE_PRIORITY_LOW (-2)                   // 低
 #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN       // 后台
 
 >>>二、串行队列
 GCD 获取串行有2种途径
 使用dispatch_queue_create函数创建串行队列
 // 创建串行队列 (队列类型传递NULL或者DISPATCH_QUEUE_SERIAL)
 dispatch_queue_create("com.lyh.queue", DISPATCH_QUEUE_SERIAL);

 使用主队列(跟主线程相关联的队列)
 主队列是GCD自带的一种特殊的串行队列
 放到主队列的任务,都会放到主线程中执行
 dispatch_get_main_queue() 获得主队列
 
 >>>三、各个队列的执行效果


 */
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//    [self asyncMain];
//    [self syncMain]; // 在主线程 调用 主队列 引起死锁
    
    [NSThread detachNewThreadSelector:@selector(syncMain) toTarget:self withObject:nil]; // 创建一个子线程(当前主线程处于空闲状态)
    
}

#pragma mark 一、 异步函数 + 主队列
// 所有任务都会在主线程中执行,不会开现场, 任务是串行执行
- (void)asyncMain
{
    // 1.获取主队列
    dispatch_queue_t mainQueue =  dispatch_get_main_queue();
    
    // 2.封装任务,将任务添加到队列里面
    // 异步函数
    dispatch_async(mainQueue, ^{
        NSLog(@"download1 -- %@",[NSThread currentThread]);
    });
    dispatch_async(mainQueue, ^{
        NSLog(@"download2 -- %@",[NSThread currentThread]);
    });
    dispatch_async(mainQueue, ^{
        NSLog(@"download3 -- %@",[NSThread currentThread]);
    });
}

#pragma mark 二、 同步函数 + 主队列 (产生死锁)
/**
 主队列的特点: 如果主队列发现当前主线程有任务在执行
             那么主队列会暂停调用队列中的任务,知道主线程空闲位置
 // 同步函数 : 立刻马上执行,如果我没有执行完毕,那么后面的也别想执行
 */

- (void)syncMain
{
    // 1.获取主队列
    dispatch_queue_t mainQueue =  dispatch_get_main_queue();
    
    NSLog(@"start");
    // 2.封装任务,将任务添加到队列里面
    // 同步函数 : 立刻马上执行,如果我没有执行完毕,那么后面的也别想执行
    dispatch_sync(mainQueue, ^{
        NSLog(@"download1 -- %@",[NSThread currentThread]);
    });
    dispatch_sync(mainQueue, ^{
        NSLog(@"download2 -- %@",[NSThread currentThread]);
    });
    dispatch_sync(mainQueue, ^{
        NSLog(@"download3 -- %@",[NSThread currentThread]);
    });
    
    NSLog(@"end");

}
@end

© 著作权归作者所有

宇鸿165
粉丝 1
博文 919
码字总数 368963
作品 0
广州
私信 提问
Python3基础之学习笔记(九)-线程-进程-协程

文章目录 1. 线程与进程 2. 协程 1. 线程与进程 进程:是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 线程:是操作系统能够...

GoldenKitten
01/15
0
0
关于iOS多线程,你看我就够了

在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项。当然也会给出几种多线程的案例,在实际使用中感受它们的区别。还有一点需要说明的是,这篇文章将会使...

伯恩的遗产
2015/07/29
0
0
关于iOS多线程

关于iOS多线程 原文地址:http://www.jianshu.com/p/0b0d9b1f1f19 在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项。当然也会给出几种多线程的案例,在实...

法斗斗
2016/03/10
15
0
Linux多线程并发服务器编程(线程池,FTP服务器)

分享网盘下载:https://pan.baidu.com/s/1gfNCcXt 密码: irfk 内容简介 本课程从最基础的进程、线程概念讲起逐步深入,通过理论与实践结合的方式,使学员快说掌握linux多线程网络编程技术,并...

人气王子333
2018/06/26
0
0
iOS 多线程之NSOperation篇举例详解

  这篇博客是接着总篇iOS GCD NSOperation NSThread等多线程各种举例详解写的一个支篇。总篇也包含了此文的链接。本文讲解的知识点有NSBlockOperationClick,队列,队列中如何加Operation...

张林峰
2016/06/22
12
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
29分钟前
3
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
今天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
今天
4
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
今天
6
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部