iOS多线程的那些事

本文深入探讨了多线程的执行原理,特别是针对iOS平台,详细讲解了Grand Central Dispatch (GCD) 的使用方法及优势。GCD作为苹果为多核并行运算提供的解决方案,能自动管理线程生命周期,提升程序执行效率。文章通过实例代码演示了串行与并行队列的不同执行效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多线程的执行原理

CPU同一时间只能处理一个线程,只有一个线程在执行。多线程“同时“执行 是CPU快速的在多个线程之间的切换.CPU执行速度较快,导致CPU调度线程的时间足够短,造成同时执行的假象。线程会提高程序执行的效率,但并不是线程数量越多越好,线程过多会导致CPU之间频繁的切换,消耗大量的资源。

iOS多线程的技术方案在这里插入图片描述

GCD介绍

1、什么是GCD
全称:Grand Central Dispatch
纯C语言,提供非常多强大的函数库
2、GCD的优势

  • GCD是苹果公司为多核的并行运算提出的解决方案
  • GCD会自动利用更多的CPU内核
  • GCD会自动的管理线程的生命周期
  • 程序员只需要告诉GCD想要执行什么代码,不需要编写任何线程管理代码

GCD的使用介绍

1、GCD的两个核心
1.任务:要执行的操作
2.队列:用来存放任务
2、GCD的使用步骤
1.创建队列
2.创建任务
3.将任务添加到队列上

  • GCD会自动将队列中的任务取出,放到对应的线程中去执行
  • 任务的取出遵循队列的FIFO原则:先进先出,后进后出

GCD执行任务的方式

1、同步的方式执行任务

  • 在主线程中执行任务,不具备开启新线程的能力

2、异步的方式执行任务

  • 在新的线程上执行任务,具备开启新线程的能力

GCD队列的类型

1、并发队列
可以让多个任务并发同时执行
并发功能只有在异步函数下才有效
2、串行队列
让任务一个接着一个的执行

GCD各种队列执行效果

在这里插入图片描述
主线程里有任务就必须等主线程任务执行完才轮到主队列
主队列一定是在主线程上执行的,主队列是全局的串行队列

代码演示


// 1 串行队列 同步执行。                               不开新线程,任务按顺序执行
- (void) demo1{
    
    NSLog(@"开始");
    
    dispatch_queue_t queue = dispatch_queue_create("GT", DISPATCH_QUEUE_SERIAL);
    
    
    for (int i = 0 ; i < 10; i++) {
        dispatch_sync(queue, ^{
               NSLog(@"hello %d, %@",i, [NSThread currentThread]);
           });
    }
    
    NSLog(@"结束");
   
}

//2 串行队列 异步执行                                  开启一个线程。 任务还是顺序执行
- (void) demo2{
    NSLog(@"开始");
    
    dispatch_queue_t queue = dispatch_queue_create("GT", DISPATCH_QUEUE_SERIAL);

    for (int i = 0 ; i < 10; i++) {
        dispatch_async(queue, ^{
               NSLog(@"hello %d, %@",i, [NSThread currentThread]);
           });
    }
    
    NSLog(@"结束");
   
}


//3  并行队列,同步执行                                  (同串行队列,同步执行类型)不开线程,顺序执行
- (void) demo3{
    NSLog(@"开始");

    dispatch_queue_t queue = dispatch_queue_create("GT", DISPATCH_QUEUE_CONCURRENT);
    
    for (int i = 0 ; i < 10; i++) {
        dispatch_sync(queue, ^{
               NSLog(@"hello %d, %@",i, [NSThread currentThread]);
           });
    }
    NSLog(@"结束");
}


//4  并行队列    异步执行。                                 开多个线程。无序执行 ,线程有共用
- (void) demo4{
    NSLog(@"开始");
    
    dispatch_queue_t queue = dispatch_queue_create("GT", DISPATCH_QUEUE_CONCURRENT);
    
    for (int i = 0 ; i < 10; i++) {
        dispatch_async(queue, ^{
               NSLog(@"hello %d, %@",i, [NSThread currentThread]);
           });
    }
    
    NSLog(@"结束");
   
}

//5  主队列 异步执行                                         在主线程上顺序执行

//主队列的特点:      先执行主线程上的代码,才会执行主队列中的任务

- (void) demo5{
    //主队列
    NSLog(@"开始");
    
    for (int i = 0; i < 10; i++) {
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"hello  %d %@",i,[NSThread currentThread]);
        });
    }
    NSLog(@"结束");
}

//6  主队列 同步执行                                              --会死锁,在主线程上执行才会死锁。
//同步执行:  会等待第一个任务执行完成才会继续往后执行。
- (void) demo6{
    NSLog(@"开始");
    
    for (int i = 0; i < 10; i++) {
        //死锁
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"hello  %d %@",i,[NSThread currentThread]);
        });
    }
    NSLog(@"结束");
}


//7  解决死锁的问题
- (void) demo7{
    NSLog(@"开始");
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        for (int i = 0; i < 10; i++) {
            dispatch_sync(dispatch_get_main_queue(), ^{
                NSLog(@"hello  %d %@",i,[NSThread currentThread]);
            });
        }
    });
    
    NSLog(@"结束");
    
}
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值