多线程GCD-牛逼中央调度器

多线程

个人理解

一般一个程序有一个主线程,主要控制点击,UI界面,如果执行一个耗时的操作的话,用户体验相当垃圾,因此我们会讲执行耗时的操作方到一个新的线程

,但是用线程的话要提防线程的安全问题,如(共享资源)导致数据错乱

如售票任务,银行存钱等(解决办法使用@synchronized(锁对象))

苹果提供了一个GCD 叫牛逼中央调度器

其工作原理是将我们要执行的耗时操作放到一个队列中去,GCD提供的方法去队列中取出任务开启线程执行,因此线程我们就不用去写什么代码

GCD有两个执行任务的函数一个是同步函数dispatch_sync,一个是异步函数

dispatch_asysc,

同步:就是在当前线程中执行,异步:在另一个线程中执行

GCD的队列也可以分为两个:

1  一个是并发队列:可以让多个任务并发(同时)执行(会自动开启多个线程)

GCD默认已经提供了全局的并发队列,供整个应用使用,不需要手动创建

使用dispatch_get_global_queue函数获得全局的并发队列

说明:全局并发队列的优先级

#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 // 后台

2  一个是串行队列:就是让任务依次执行(在一个线程中)

串行队列有两种创建队列的函数:

1>dispatch_queue_t dispatch_queue_create(创建串行队列)

2>dispatch_queue_t dispatch_get_main_queue(主队列,跟主线程相关联的队列)

代码示例:

用异步函数往并发队列中添加任务

#import "LLBViewController.h"

@interface LLBViewController ()

@end

@implementation LLBViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    // 1,获取全局并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

    // 2,添加任务到队列中,就可以执行任务
    // 异步函数:具备开启新线程的能力
    dispatch_async(queue, ^{

        NSLog(@"下载电影1-----%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{

        NSLog(@"下载电影2-----%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{

        NSLog(@"下载电影3-----%@", [NSThread currentThread]);
    });

    // 打印主线程
    NSLog(@"主线程-----%@",[NSThread currentThread]);
}

注意:同时开启3个线程

2>异步串行队列,有开启新的线程

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

   // 创建串行队列
    dispatch_queue_t queue = dispatch_queue_create("niubiGCD", NULL);
    // 第一个参数为串行队列的名称,是c语言字符串
    // 第二个为队列的属性,一般说串行队列不用赋值任何属性,传null

    // 添加任务到队列中执行
    dispatch_async(queue, ^{

        NSLog(@"下载图片1-----%@", [NSThread currentThread]);
    });

    dispatch_async(queue, ^{

        NSLog(@"下载图片2-----%@", [NSThread currentThread]);
    });

    // 非ARC需要释放队列 凡是new,alloc,retain,create都需要释放内存,因为创建对象的时候系统分配了内存
    NSLog(@"主线程------%@", [NSThread currentThread]);
}
2014-10-21 16:26:11.354 GCD[2347:907] 主线程------<NSThread: 0x7541aa0>{name = (null), num = 1}
2014-10-21 16:26:11.354 GCD[2347:1103] 下载图片1-----<NSThread: 0x757d2e0>{name = (null), num = 3}
2014-10-21 16:26:11.356 GCD[2347:1103] 下载图片2-----<NSThread: 0x757d2e0>{name = (null), num = 3}

注意:开启了新线程,但新的线程只有一个;

3>同步函数并行队列添加任务

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLog(@"主线程--------%@",[NSThread currentThread]);

    // 同步函数并发队列中添加任务
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    // 将任务添加到队列中
    dispatch_sync(queue, ^{

        NSLog(@"下载电影1-----%@", [NSThread currentThread]);
    });
    // 将任务添加到队列中
    dispatch_sync(queue, ^{

        NSLog(@"下载电影2-----%@", [NSThread currentThread]);
    });
}
2014-10-21 16:34:55.725 GCD[2374:907] 主线程--------<NSThread: 0x762a0a0>{name = (null), num = 1}
2014-10-21 16:34:55.726 GCD[2374:907] 下载电影1-----<NSThread: 0x762a0a0>{name = (null), num = 1}
2014-10-21 16:34:55.726 GCD[2374:907] 下载电影2-----<NSThread: 0x762a0a0>{name = (null), num = 1}

注意:同步函数不具备开启新线程的能力,利用了当前线程

4>同步函数串行队列中添加任务

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLog(@"主线程--------%@",[NSThread currentThread]);

    // 同步函数串行队列中添加任务
    dispatch_queue_t queue = dispatch_queue_create("niubiGDC", NULL);

    // 将任务添加到队列中
    dispatch_sync(queue, ^{

        NSLog(@"下载电影1-----%@", [NSThread currentThread]);
    });
    // 将任务添加到队列中
    dispatch_sync(queue, ^{

        NSLog(@"下载电影2-----%@", [NSThread currentThread]);
    });
}
2014-10-21 16:38:36.116 GCD[2391:907] 主线程--------<NSThread: 0x763e4a0>{name = (null), num = 1}
2014-10-21 16:38:36.117 GCD[2391:907] 下载电影1-----<NSThread: 0x763e4a0>{name = (null), num = 1}
2014-10-21 16:38:36.118 GCD[2391:907] 下载电影2-----<NSThread: 0x763e4a0>{name = (null), num = 1}

注意:不会开启新的线程,还是当前主线程

时间: 2024-10-06 06:17:04

多线程GCD-牛逼中央调度器的相关文章

java——springmvc——注册中央调度器

在WEB-INF下的web.xml中配置 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jc

GCD&quot;牛逼的中枢调度器&quot;

GCD的基本使用: - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // dispatch_sync : 同步,不具备开启线程的能力 // dispatch_async : 异步,具备开启线程的能力 // 并发队列 :多个任务可以同时执行 // 串行队列 :一个任务执行完后,再执行下一个任务 // 获得全局的并发队列 dispatch_queue_t queue = dispatch_get_global_qu

多线程 04---超级牛逼的GCD

忘记NSThread中关于线程的所有概念吧,现在只需要知道两样东西,就能解决问题:任务,队列 1.基本概念: 1.什么是GCD 全称是Grand Central Dispatch,可译为"牛逼的中枢调度器" 纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内核(比如双核.四核) GCD会自动管理线程的生命周期(创建线程.调度任务.销毁线程) 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码

多线程——范例:建立与启动两个线程 与 范例:显示调度器有多个不可预测的结果(Head First Java的例子)

//范例:建立与启动两个线程 public class ThreadTest implements Runnable{ public static void main(String[] args) { ThreadTest runner=new ThreadTest();//创建Runnable的实例 Thread alpha=new Thread(runner); Thread beta=new Thread(runner);//创建两个线程,使用相同的Runnable,即相同的任务 alph

多线程 GCD

n多线程 GCD n简介 n什么是GCD p全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” p纯C语言,提供了非常多强大的函数 p nGCD的优势 pGCD是苹果公司为多核的并行运算提出的解决方案 pGCD会自动利用更多的CPU内核(比如双核.四核) pGCD会自动管理线程的生命周期(创建线程.调度任务.销毁线程) p程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码 n任务和队列 nGCD中有2个核心概念 p任务:执行什么操作 p队列:用来存放任

iOS开发-多线程-GCD

OS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内核(比如双核.四核) GCD会自动管理线程的生命周期(创建线程.调度任务.销毁线程) 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码 3.提示 (1)GCD存在于libdispatch.dylib这个库中,

【iOS】多线程GCD

GCD(Grand Central Dispatch) : 牛逼的中枢调度器.苹果自带,纯C语言实现,提供了非常多且强大的函数,它可以提高代码的执行效率与多核的利用率. 一.GCD的基本使用 1.GCD中的两个核心概念: ?任务: 执行什么任务. ?队列: 用来存放任务. (用来调度任务) 2.GCD使用的2个步骤: ?1.定制任务. (确定想做的事情) ?2.将任务添加到队列中. ?GCD会自动将队列中的任务取出, 放到对应的线程中执行. ?遵循队列的FIFO原则: 先进先出. 3.同步和异步

IOS开发之多线程 -- GCD的方方面面

前言:这篇GCD的博文是本人阅读了很多海内外大神的关于GCD的文章,以及结合之前自己对GCD的粗浅的认识,然后取其精华,去其槽粕,综合起来的笔记,而且是尽可能的以通熟易懂的并且是正确的理论论述方式呈现给读者,同时也是讲大神博客中有的深涩的理论理解的通熟易懂转述给读者,已经是尽可能的让读者深入理解和掌握多线程的知识以及GCD的使用技术.最后的附录中,我将会给出所有本人阅读的大神写的关于多线程或者是GCD的文章链接,大家感兴趣的,可以去参考和学习.也许,看我的这篇就够了,因为我就是参考他们的,嘻嘻.

iOS多线程与网络开发之多线程GCD

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 如果文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额随意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源码下载:点我传送 游戏官方下载:http://dwz.cn/RwTjl 游戏视频预览:http://dwz.cn/RzHHd 游戏开发博客:http://dwz.cn/RzJzI 游戏源码传送:http://dwz.cn/Nret1 A.GCD基本使用 1.GCD的概念 什么是GCD全称是Grand Central Dispat