iOS

iOS 同步、异步、串行、并发(并行)学习

2020-04-04  本文已影响0人  EngineerPan

队列优先级

DISPATCH_QUEUE_PRIORITY_HIGH 2                  // 优先级高
DISPATCH_QUEUE_PRIORITY_DEFAULT 0               // 优先级中
DISPATCH_QUEUE_PRIORITY_LOW (-2)                // 优先级低
DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN    // 后台任务优先级

队列类型

// 串行队列
DISPATCH_QUEUE_SERIAL   

// 并发队列
DISPATCH_QUEUE_CONCURRENT

队列创建方式

// 默认优先级的串行队列
dispatch_queue_t serialQueue = dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_SERIAL);

// 主队列
dispatch_queue_t serialQueue = dispatch_get_main_queue();
// 默认优先级的并行队列
dispatch_queue_t conCurrentQueue = dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_CONCURRENT);

// 全局队列
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);

同步函数和异步函数决定了要不要创建新的线程;
同步函数:在当前线程中执行队列里面的任务,不具备开启线程的能力;
异步函数:在新的线程中执行队列里面的任务,具备开启线程的能力;

串行和并行决定了任务的执行方式
串行:一个任务执行完毕后,再执行下一个任务;
并行:多个任务并行执行;

注意:同步执行队列任务,不管是串行还是并行队列,任务都是顺序执行的;

  1. 同步执行串行任务(不会创建新线程(在主线程中执行),任务顺序执行)
dispatch_queue_t serialQueue = dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_SERIAL);

/// 任务1
dispatch_sync(serialQueue, ^{
    NSLog(@"同步执行串行队列任务1----当前线程:%@", [NSThread currentThread]);
});

/// 任务2
dispatch_sync(serialQueue, ^{
    NSLog(@"同步执行串行队列任务2----当前线程:%@", [NSThread currentThread]);
});
  1. 同步执行串行(主队列)任务(死锁,主线程和主队列互相等待)
dispatch_queue_t mainQueue = dispatch_get_main_queue();
    
/// 任务1
dispatch_sync(mainQueue, ^{
    NSLog(@"同步执行主队列任务1----当前线程:%@", [NSThread currentThread]);
});
    
/// 任务2
dispatch_sync(mainQueue, ^{
    NSLog(@"同步执行主队列任务2----当前线程:%@", [NSThread currentThread]);
});
  1. 同步执行并发任务(不会创建新线程(在主线程中执行),任务顺序执行)
dispatch_queue_t conCurrentQueue = dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_CONCURRENT);

/// 任务1
dispatch_sync(conCurrentQueue, ^{
    NSLog(@"同步执行并发任务1----当前线程:%@", [NSThread currentThread]);
});

/// 任务2
dispatch_sync(conCurrentQueue, ^{
    NSLog(@"同步执行并发任务2----当前线程:%@", [NSThread currentThread]);
});
  1. 同步执行并发(全局队列)任务(不会创建新线程,任务顺序执行)
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);

/// 任务1
dispatch_sync(globalQueue, ^{
    NSLog(@"同步执行全局队列任务1----当前线程:%@", [NSThread currentThread]);
});

/// 任务2
dispatch_sync(globalQueue, ^{
    NSLog(@"同步执行全局队列任务2----当前线程:%@", [NSThread currentThread]);
});
  1. 异步执行串行任务(创建新线程,任务顺序执行)
dispatch_queue_t serialQueue = dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_SERIAL);

/// 任务1
dispatch_async(serialQueue, ^{
    NSLog(@"异步执行串行队列任务1----当前线程:%@", [NSThread currentThread]);
});

/// 任务2
dispatch_async(serialQueue, ^{
    NSLog(@"异步执行串行队列任务2----当前线程:%@", [NSThread currentThread]);
});
  1. 异步执行串行(主队列)任务(不会创建新线程,任务顺序执行)
dispatch_queue_t mainQueue = dispatch_get_main_queue();

/// 任务1
dispatch_async(mainQueue, ^{
    NSLog(@"异步执行主队列任务1----当前线程:%@", [NSThread currentThread]);
});

/// 任务2
dispatch_async(mainQueue, ^{
    NSLog(@"异步执行主队列任务2----当前线程:%@", [NSThread currentThread]);
});
  1. 异步执行并发队列任务(会创建新线程,任务无序执行)
dispatch_queue_t conCurrentQueue = dispatch_queue_create(DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_CONCURRENT);

/// 任务1
dispatch_async(conCurrentQueue, ^{
    NSLog(@"异步执行并发队列任务1----当前线程:%@", [NSThread currentThread]);
});

/// 任务2
dispatch_async(conCurrentQueue, ^{
    NSLog(@"异步执行并发队列任务2----当前线程:%@", [NSThread currentThread]);
});
  1. 异步执行并发(全局)队列任务(会创建新线程,任务无序执行)
dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);

/// 任务1
dispatch_async(globalQueue, ^{
    NSLog(@"异步执行全局并发队列任务1----当前线程:%@", [NSThread currentThread]);
});

/// 任务2
dispatch_async(globalQueue, ^{
    NSLog(@"异步执行全局并发队列任务2----当前线程:%@", [NSThread currentThread]);
});
上一篇下一篇

猜你喜欢

热点阅读