iOS技术文章

知识小总结一 (多线程)☀️

2017-02-07  本文已影响20人  LeaderBiao

线程与多线程相关概念


进程


线程


进程和线程的主要差别


重要概念(非常非常重要,不能理解这些概念多线程这辈子也学不会)


iOS中队列的种类有


iOS中常用的多线程技术

pthread "已被抛弃"
NSThread
NSOperation
GCD

NSThread

[NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:nil];```

- 获取当前线程
```swift
[NSThread currentThread];```

- 获取主线程
```swift
[NSThread mainThread];```


----

####GCD

- GCD(Grand Central Dispatch)是基于C语言开发的一套多线程开发机制,也是目前苹果官方推荐的多线程开发方法。它会自动合理地利用更多的CPU内核(比如双核、四核),最重要的是它会自动管理线程的生命周期(创建线程、调度任务、销毁线程),完全不需要我们管理,我们只需要告诉干什么就行。

####队列

- 获取主队列

dispatch_queue_t queue = dispatch_get_main_queue();```

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);```

----
####创建队列

- 创建串行队列 

dispatch_queue_t queue = dispatch_queue_create("testQueue", NULL);```

dispatch_queue_t queue = dispatch_queue_create("testQueue", DISPATCH_QUEUE_CONCURRENT);```

####任务
- 创建同步任务

dispatch_sync(queue1, ^{

});```

dispatch_async(queue2, ^{

  });```

----

####队列组

- 队列组可以将很多队列添加到一个组里,这样做的好处是,当这个组里所有的任务都执行完了,队列组会通过一个方法通知我们

1、创建队列组
dispatch_group_t group = dispatch_group_create();
2、创建队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
3、使用队列组的方法执行任务
dispatch_group_async(group, queue, ^{

});
4、当队列组的方法全部执行完后,会执行
dispatch_group_notify(group, dispatch_get_main_queue(), ^{

});```


线程死锁


NSOperation

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];```


- 通过NSBlockOperation创建任务

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

}];```


队列

获取主队列
NSOperationQueue *queue = [NSOperationQueue mainQueue];
创建其他队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
往队列中添加任务
[queue addOperation:operation];
NSOperationQueue有一个属性maxConcurrentOperationCount代表最大并发数,用来设置最多可以让多少个任务同时执行。当设置为 1 的时候,就是串行队列。```

----

####线程依赖

- NSOperation 有一个非常实用的功能,那就是添加依赖。比如有 3 个任务:A: 从服务器上下载一张图片,B:给这张图片加个水印,C:把图片返回给服务器。

- 这时就可以用到依赖了

[operation2 addDependency:operation1];
[operation3 addDependency:operation2];
[queue addOperations:@[operation3, operation2, operation1] waitUntilFinished:NO];```

NSThread
[self performSelectorOnMainThread:@selector(run) withObject:nil waitUntilDone:NO];

GCD

dispatch_async(dispatch_get_main_queue(), ^{

});```


####NSOperation

[[NSOperationQueue mainQueue] addOperationWithBlock:^{

}];```

线程同步

@synchronized(self) {
    //需要执行的代码块
}```

- 同步执行 :我们可以把多个线程都要执行此段代码添加到同一个串行队列,这样就实现了线程同步的概念。
上一篇 下一篇

猜你喜欢

热点阅读