iOS 多线程总结之GCD的使用详解

2020-01-21 01:40:53刘景俊

4.任务的创建方法


// 同步执行任务创建方法
dispatch_sync(queue, ^{
NSLog(@"%@",[NSThread currentThread]); // 这里放任务代码
});
// 异步执行任务创建方法
dispatch_async(queue, ^{
NSLog(@"%@",[NSThread currentThread]); // 这里放任务代码
});

虽然使用GCD只需两步,但是既然我们有两种队列,两种任务执行方式,那么我们就有了四种不同的组合方式。这四种不同的组合方式是

1.并行队列 + 同步执行
2.并行队列 + 异步执行
3.串行队列 + 同步执行
4.串行队列 + 异步执行

5.GCD的基本使用

并行队列+同步执行

不会开启新线程,执行完一个任务,再执行下一个任务


-(void) syncConcurrent{
NSLog(@"syncConcurrent---begin");
dispatch_queue_t queue= dispatch_queue_create("test.queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(queue, ^{
  for (int i = 0; i < 2; ++i) {
    NSLog(@"1------%@",[NSThread currentThread]);
  }
});
dispatch_sync(queue, ^{
  for (int i = 0; i < 2; ++i) {
    NSLog(@"2------%@",[NSThread currentThread]);
  }
});
dispatch_sync(queue, ^{
  for (int i = 0; i < 2; ++i) {
    NSLog(@"3------%@",[NSThread currentThread]);
  }
});

NSLog(@"syncConcurrent---end");
 }

并行队列 + 异步执行

可同时开启多线程,任务交替执行


- (void) asyncConcurrent
{
NSLog(@"asyncConcurrent---begin");

dispatch_queue_t queue= dispatch_queue_create("test.queue", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{
 for (int i = 0; i < 2; ++i) {
   NSLog(@"1------%@",[NSThread currentThread]);
 }
});
dispatch_async(queue, ^{
 for (int i = 0; i < 2; ++i) {
   NSLog(@"2------%@",[NSThread currentThread]);
 }
});
dispatch_async(queue, ^{
 for (int i = 0; i < 2; ++i) {
   NSLog(@"3------%@",[NSThread currentThread]);
 }
});

NSLog(@"asyncConcurrent---end");
}

串行队列 + 同步执行

不会开启新线程,在当前线程执行任务。任务是串行的,执行完一个任务,再执行下一个任务


- (void) syncSerial
{
NSLog(@"syncSerial---begin");

dispatch_queue_t queue = dispatch_queue_create("test.queue", DISPATCH_QUEUE_SERIAL);

 dispatch_sync(queue, ^{
 for (int i = 0; i < 2; ++i) {
   NSLog(@"1------%@",[NSThread currentThread]);
 }
});  
dispatch_sync(queue, ^{
 for (int i = 0; i < 2; ++i) {
   NSLog(@"2------%@",[NSThread currentThread]);
 }
});
dispatch_sync(queue, ^{
 for (int i = 0; i < 2; ++i) {
   NSLog(@"3------%@",[NSThread currentThread]);
 }
});

NSLog(@"syncSerial---end");
}

串行队列 + 异步执行

会开启新线程,但是因为任务是串行的,执行完一个任务,再执行下一个任务