美文网首页
iOS_多线程_基本概念

iOS_多线程_基本概念

作者: MR_詹 | 来源:发表于2020-10-13 13:32 被阅读0次

iOS多线程方案


image.png

同步、异步、并发、串行
同步:在当前线程中执行任务,不具备开启新线程的能力。
注意:需要立马在当前线程执行任务,执行完毕后才能继续往下执行

异步:在新的线程中执行任务,具备开启新线程的能力(但不一定都会开启新线程,比如在主队列中,因为主队列中的每个任务都必须是在主线程中执行的)
注意:不要求立马执行

并发和串行主要影响:任务的执行方式
并发:多个任务并发(同时)执行
串行:一个任务执行完毕后,在执行下一个任务

 /// 创建一个串行队列
dispatch_queue_t queue = dispatch_queue_create("my_queue", DISPATCH_QUEUE_SERIAL);
/// 创建一个并发队列
dispatch_queue_t asyncQueue = dispatch_queue_create("async_queue", DISPATCH_QUEUE_CONCURRENT);
/// 获取全局队列(也是一个并发队列)
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
/// 获获取主队列(主队列也是一个特殊的串行队列,因为主队列的任务是不会开启新的子线程执行的,都必须在主队列中执行)
dispatch_queue_t mainQueue = dispatch_get_main_queue();


/// 同步任务
/// 任务1
dispatch_async(asyncQueue, ^{
 for (int i=0; i<5; i++) {
  NSLog(@"执行任务1 %d:%@",i,[NSThread currentThread]);
   }
});
    
/// 同步任务
/// 任务2
dispatch_async(asyncQueue, ^{
  for (int i=0; i<5; i++) {
    NSLog(@"执行任务2 %d:%@",i,[NSThread currentThread]);
   }
 }); 

[图片上传失败...(image-9705ca-1602519329137)]

# 以下代码会产生死锁

#提醒:线程的任务是指代码块,都是以中括号{}为准,比如此处主队列总共有两个任务:
任务1:viewDidLoad{}
任务2:dispatch_sync{}

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];

    NSLog(@"打印1");
    
    /// 队列的特点:排队,FIFO,First In First Out 先进先出
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_sync(queue, ^{
        NSLog(@"打印2");
    });
    /// dispatch_sync : 立马在当前线程执行任务,执行完毕后才能继续往下执行

    NSLog(@"打印3");
}

@end
# 也是会产生死锁:因为在子串行队列中,添加了同步任务
打印结果是:1 5 2 崩溃

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    NSLog(@"打印1");
    
    dispatch_queue_t queue = dispatch_queue_create("my_queue", DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue, ^{
        NSLog(@"打印2");
        dispatch_sync(queue, ^{
            NSLog(@"打印3");
        });
        NSLog(@"打印4");
    });
    
    NSLog(@"打印5");
}

@end
# 换成这种写法不会产生死锁,因为my_queue是并发队列,那么也就是说队列里的任务是可以同时执行的,
# 不需要等待一个任务执行完成后才去执行另外一个任务

打印结果:1 5 2 3 4

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    NSLog(@"打印1 %@",[NSThread currentThread]);
    
    dispatch_queue_t queue = dispatch_queue_create("my_queue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{    /// my_queue队列:任务1
        NSLog(@"打印2 %@",[NSThread currentThread]);
        dispatch_sync(queue, ^{     /// my_queue队列:任务2
            NSLog(@"打印3 %@",[NSThread currentThread]);
        });
        NSLog(@"打印4 %@",[NSThread currentThread]);
    });
    
    NSLog(@"打印5 %@",[NSThread currentThread]);
}

@end

相关文章

  • iOS_进程与线程(多进程与多线程)

    iOS_进程与线程(多进程与多线程)

  • iOS_多线程_基本概念

    iOS多线程方案 同步、异步、并发、串行同步:在当前线程中执行任务,不具备开启新线程的能力。注意:需要立马在当前线...

  • iOS好文整理

    大神: iOS_吴白iOS大全_破船之家sunnyxx 架构,多线程,源码 面试 ----iOS 面试常见问题最全...

  • iOS_多线程

    NSThread NSThread是轻量级的多线程开发,使用起来也并不复杂,但是使用NSThread需要自己管理线...

  • iOS多线程之 pThread

    前面总结了多线程的基本概念,今天学习总结一下多线程的其中一种实现方案pThread 一、基本概念 pThread(...

  • 高并发多线程总结

    1.多线程基本概念 首先,我们要理解多线程编程,必须清楚几个基本概念:进程——进程是操作系统层面的概念,它是操作系...

  • iOS 多线程之GCD

    目录 GCD的基本概念 Dispatch Queue Dispatch Group 一、GCD的基本概念 多线程的...

  • iOS开发多线程篇--基本概念和创建方式

    目录 一 基本概念 二 OC中的多线程 一 基本概念 多线程按字面意思是同步完成多项任务,提高了资源的使用效率,从...

  • iOS_多线程理解

    1.基本概念: 什么是进程: 1)进程是一个具有独立功能的程序关于某次数据集合的一次运行活动,他是操作系统分配资源...

  • Chapter 10. 多线程

    阅读原文 Chapter 10. 多线程 10.1 多线程概述 基本概念:程序 - 进程 - 线程 程序(prog...

网友评论

      本文标题:iOS_多线程_基本概念

      本文链接:https://www.haomeiwen.com/subject/frcmpktx.html