GCD是使用多线程的一种方式 在处理大量数据方面有着巨大的优势 它会自动管理线程的生命周期 对于使用者来说非常的方便 下面来简单介绍下使用
1.线程的设计
1.1创建线程
dispatch_queue_t ch_queue_1 =dispatch_queue_create("ch_queue_1",DISPATCH_QUEUE_CONCURRENT);第一个参数是类似id的字符串 设置的时候只需要保证唯一性即可 后面的参数 DISPATCH_QUEUE_CONCURRENT 代表并行队列
DISPATCH_QUEUE_SERIAL代表串行队列
1.2获取程序自带的线程
当然 系统为我们的软件自动分配三个线程 我们通过 dispath_get_global_queue(,)来获取
其中有两个参数 第二个暂时用不到 第一个是线程的优先级
DISPATCH_QUEUE_PRIORITY_BACKGROUND 优先级最低
DISPATCH_QUEUE_PRIORITY_LOW优先级低
DISPATCH_QUEUE_PRIORITY_DEFAULT 默认优先级
DISPATCH_QUEUE_PRIORITY_HIGH优先级高
1.3只执行一次的操作 常用于写单例
dispatch_once_t
1.4延迟执行的操作
dispatch_after(,)有2个参数 第一个是起始时间和延迟时间的长度 第二个是线程
1.5线程组 是一种同步机制 可以让一些线程先执行 然后一些线程最后执行 控制线程顺序
dispatch_group_t 创建线程组
最后执行的话应该使用dispatch_group_notify
1.6把某些代码执行n编
dispatch_apply 需要注意的是这执行n编的代码是并行执行的
可以看到执行顺序完全被打乱的
1.7同一个线程的不同任务实现同步
dispatch_barrier_async
在这之前的线程都会执行完在继续执行后面的代码
前两次的执行是同步执行的 但是dispatch_barrier_async中的代码总会在前两次完成之后再继续执行
2.任务执行方式 与 队列
在GCD中 搞清楚 任务 队列是非常重要的 任务是什么呢 简单说就是 GCD中block块中的执行代码 任务执行方式有两种 同步执行 和异步执行 而队列有两种 串行队列和并行队列 有什么区别呢?? 下面通过代码来演示吧
2.1 我们先创建两个并行队列 使用异步执行
简单循环十条数据 下面看看打印结果
第二次与第一次一样 所以又打印一次
只是截取前几条数据 可以发现 第一次与第三次 顺序不一样 所以 并行队列就是 并发执行任务 没有先后顺序 那串行对列 就是按照代码先后顺序来执行 如果显示结果一直都会是第一条的结果的
2.2 我们再创建两个并发队列 使用同步执行
看看 结果
可以看到先执行完第一个线程的操作然后才会执行第二个 在刚才我们测试串行 和并行的时候用的是 异步执行 所以由此可以看出 同步执行会先执行完一个线程 然后再执行 下一个 所以会造成线程堵塞 如果是一个死循环呢? 那么代码就无法继续往下执行了 这个时候称为线程死锁 当然 由于异步执行会同时执行任务 不会出现线程无法执行任务的情况 也就不会有这些问题了