多线程的那些事

1,681 阅读3分钟

多线程的执行原理

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