pthread 实现多线程操作
代码实现:
void * run(void *param)
{
}
@implementation ViewController
- (IBAction)clickButton:(id)sender {
}
NSThread实现多线程
一个 NSThread 对象就代表一条线程
创建线程的多种方式
第一种方式:先创建再启动线程
第二种:直接创建并启动线程
第三种:
方法2和方法3的优点:快捷 方法1的优点:可以轻松拿到线程
线程间通信
线程间通信的体现
1个线程传递数据给另1个线程
在1个线程中执行完特定任务后,转到另1个线程继续执行任务
线程间通信的常用方法:小程序图片下载
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// 另开1条线程 object用于数据的传递
}
// 下载图片
- (void)downLoadWithURL:(NSURL *)url
{
}
以上两种方式使用线程已经过时了,开发中我们操作线程大多都使用 GCD 和 NSOperation 来实现多线程操作。
下面我就给大家系统的介绍一下 GCD 是如何实现多线程的
GCD 实现多线程
GCD 简介
GCD 全称是Grand Central Dispatch,可译为“超级厉害的中枢调度器”,GCD 是苹果公司为多核的并行运算提出的解决方案, GCD会自动利用更多的 CPU 内核(比如双核、四核)来开启线程执行任务,GCD 会自动管理线程的生命周期(创建线程、调度任务、销毁线程),不需要我们程序员手动管理内存。
任务和队列
任务:在同步函数和异步函数中执行
队列:用来存放任务(并发 串行)
GCD会自动将队列中的任务取出,放到对应的线程,任务的取出遵循FIFO,即先入先出队列,First Input First Output 的缩写。先进入的任务先完成并结束,再执行后面的任务。
同步函数和异步函数,并发队列和串行队列
用同步的方式执行任务:在当前线程中可立即执行任务,不具备开启线程的能力
用异步的方式执行任务:在当前线程结束时执行任务,具备开启新的线程的能力
并发队列:允许多个任务同时执行
串行队列:一个任务执行完毕后,再执行下一个任务
创建并发/串行队列代码:
// 创建并发队列
// 参1:const char *label 队列名称
// 参2:dispatch_queue_attr_t attr 队列类型
dispatch_queue_t queueConcurrent = dispatch_queue_create("520it.com", DISPATCH_QUEUE_CONCURRENT);
// 创建串行队列
dispatch_queue_t queueSerial = dispatch_queue_create("520it.com", DISPATCH_QUEUE_SERIAL);
// 获取全局队列 全局队列是并发队列
// 参1:队列的优先级
// 参2:0(以后可能用到的参数)
dispatch_queue_t queueGlobal = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 全局并发队列的优先级
#define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认(中)
#define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台
// 获取主队列
dispatch_queue_t queueMain = dispatch_get_main_queue();
同步/异步函数代码表示:
// GCD同步函数串行队列(立即执行,当前线程)
// 参1: dispatch_queue_t queue 队列
// 参2: 任务
dispatch_sync(queueSerial, ^{