文章标题

来源:互联网 发布:中国10月经济数据 编辑:程序博客网 时间:2024/06/13 07:08

//
// ViewController.m
// UI-NO-26-多线程-GCD
//
// Created by 杨政涛 on 15/8/28.
// Copyright (c) 2015年 杨政涛. All rights reserved.
//

import “ViewController.h”

@interface ViewController ()

@end

@implementation ViewController

  • (void)viewDidLoad {
    [super viewDidLoad];
    /*
    Grand Central Dispatch(GCD)是苹果比较提倡的一个多核编程的解决方法
    GCD 底层也是用线程来实现,只是苹果帮咱们封装了具体操作的方法,这样可以让程序员不用关注实现的细节,只需要专注功能的实现

    GCD参数: queue:队列 block:任务

    GCD 有两种执行任务的方式 1.同步dispatch_sync(避免在主队列中使用同步执行主线程任务,容易死锁) 2.异步dispatch_async

    同步和异步的区别:
    同步:在当前线程中去执行
    异步:在另一条线程中执行

    GCD执行多任务的队列方式 也有两种:
    1.串行队列:让任务一个接着一个地执行(一个任务执行完毕后,再去执行下一个任务)
    2.并发任务:可以让多个任务并发(同时)执行 (自动开启 多个线程同时任务)并发功能只有在异步(dispatch_async)函数下才有效

    串行队列又分为两种:
    1.主队列 dispatch_get_main_queue() 主队列是GCD自带的一种特殊的串行队列,放在主队列中的任务,都会放到主线程中执行
    2.创建一个队列dispatch_queue_create

    */

    /*

// 死锁 是在主队列(GCD)里面 在主线程(UI线程)执行任务
// 主队列 跟 主线程 是一个东西
// 同步执行 一个任务完毕之后,才会去执行另外一个任务
// 主队列(GCD)《同步执行》某个任务的时候 会等待前面的任务执行完毕之后,再去执行 主队列里面的任务
// 但是 主队列 实在主线程里面执行任务的 (**它们两个现在在同一个线程里面) 线程是顺序执行任务的 这时候主线程会等 主队列里面的任务执行完毕 再去继续执行主队列 会等待 主线程 执行完毕 才去执行 主队列里面的任务

// 通过GCD 获得主队列
// 所有接收队列对象 都用dispatch_queue_t
dispatch_queue_t mainQuene = dispatch_get_main_queue();

// NSLog(@”主线程执行到这暂停 等待主队列 执行”);
//
//// 同步执行任务 dispatch_sync
// dispatch_sync(mainQuene, ^{
//// BLOCK 里面 是具体执行的某个任务
//
// NSLog(@”主队列 等待 主线程 执行完毕之后 再执行”); //此时已经死锁了,界面卡死了(理由就是 互相谦让 导致的 界面卡死的现象)
//
// });

// 异步执行
// 异步 允许 开辟一个线程(利用系统空闲时间去执行 程序员 不能控制)
// 同步 不允许 开辟线程 (同步顺序执行)

NSLog(@"主线程执行到这儿   发现一个异步执行的代码  会执行异步执行的代码   但是没有等待里面执行完毕之后,再去继续执行主线程里面的任务"); dispatch_async(mainQuene, ^{     NSLog(@"主线程没有等我执行完毕");     NSLog(@"更新UI%@",[NSThread currentThread]);  //不按顺序执行,只有当执行网后面的,系统有了空闲时间  才执行这儿  (先输出的是后面的 NSLog(@"......") ,再输出这一句) });NSLog(@"......");    */   /*

// 主队列 dispatch_get_main_queue() 也是串行队列
// dispatch_queue_create(“”,NULL) 串行队列

// 串行队列: 按照顺序去执行队列

dispatch_queue_t mainQueue = dispatch_get_main_queue();dispatch_async(mainQueue, ^{    NSLog(@"----1");});dispatch_async(mainQueue, ^{    NSLog(@"----2");});dispatch_async(mainQueue, ^{    NSLog(@"----3");});    *//*

// 自己创建队列的方式
dispatch_queue_t yzt = dispatch_queue_create(“阿凡达”, NULL);
// 一般都写NULL
dispatch_sync(yzt, ^{
NSLog(@”111”);
});

dispatch_sync(yzt, ^{    NSLog(@"222");});dispatch_sync(yzt, ^{    NSLog(@"333");});    */

// ⭐️⭐️⭐️⭐️⭐️⭐️ 和同步 异步没有关系
// 串行队列 有两种方式:
// 1.主队列
// 2.创建队列
// 串行 队列是按照顺序去执行的

  /*

// 并发队列
// 并发队列 可以指定队列任务的优先级
// 使用 全局并发队列(在开发的时候)

// #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认(中)
//#define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低
//#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台

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

// long identifier 指定优先级
// unsigned long flags 官方文档说的,现在不使用 先传0

dispatch_queue_t firstQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);

dispatch_queue_t twoQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

dispatch_queue_t threeQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

// ⭐️⭐️⭐️⭐️⭐️ 必须用异步
dispatch_async(firstQueue, ^{
NSLog(@”111”);
});
dispatch_async(twoQueue, ^{
NSLog(@”222”);
});
dispatch_async(threeQueue, ^{
NSLog(@”333”);
});

    */

// 分组

// dispatch_group_create() 创建一个分组

// 组的类名 dispatch_group_t
dispatch_group_t num1 = dispatch_group_create();
// 分组还需要线程
dispatch_queue_t queue1 = dispatch_queue_create(“num1”, NULL);

dispatch_group_async(num1, queue1, ^{    NSLog(@"download1.....");});dispatch_group_async(num1, queue1, ^{    NSLog(@"download2.....");});

// 分组执行完毕
dispatch_group_notify(num1, queue1, ^{
NSLog(@”分组执行完毕”);
});

// 第二个分组 把每一个分组看成一个整体
dispatch_group_t num2 = dispatch_group_create();

dispatch_group_async(num2, queue1, ^{    NSLog(@"1download1.....");});dispatch_group_async(num2, queue1, ^{    NSLog(@"2download2.....");});

//* 设置同时下载任务
// int nums;
// nums = 3;
// for (int i = 0; i

0 0