iOS中多线程的实现方案
pthread
a.特点:
1)一套通用的多线程API
2)适用于Unix\Linux\Windows等系统
3)跨平台\可移植
4)使用难度大
b.使用语言:c语言
c.使用频率:几乎不用
d.线程生命周期:由程序员进行管理
NSThread
a.特点:
1)使用更加面向对象
2)简单易用,可直接操作线程对象
b.使用语言:OC语言
c.使用频率:偶尔使用
d.线程生命周期:由程序员进行管理
GCD
a.特点:
1)旨在替代NSThread等线程技术
2)充分利用设备的多核(自动)
b.使用语言:C语言
c.使用频率:经常使用
d.线程生命周期:自动管理
NSOperation
a.特点:
1)基于GCD(底层是GCD)
2)比GCD多了一些更简单实用的功能
3)使用更加面向对象
b.使用语言:OC语言
c.使用频率:经常使用
d.线程生命周期:自动管理
GCD
(1)GCD基础知识
1.队列(用来存放任务)和任务(执行什么操作)
队列分三种:1.主队列the main queue(主线程就在这个队列);2.全局并发队列;3.自定义队列(dispatch_queue_create)
2.同步函数(按顺序执行)和异步函数(dispatch_async同时执行多个任务);
同步:只能在当前线程中执行任务,不具备开启新线程的能力;
异步:可以在新的的线程里执行任务,具备开启新线程的能力;
(2)GCD使用步骤
1.定制任务
2.将任务添加到队列中
GCD会自动将队列中任务取出,放到对应的线程中执行;任务取出遵循FIFO原则:先进先出,后进后出;
1>.创建队列
创建并发队列
1.dispatch_queue_t queue = dispatch_queue_create(@"队列名称",DISPATCH_QUEUE_CONCURRENT);
2.全局并发队列dispatch_get_global_queue(0,0);
创建串行队列
1.dispatch_queue_t queue = dispatch_queue_create(@"队列名",NULL);
2.主队列dispatch_queue_t queue = dispatch_get_main_queue();
注意点
异步+并行 = 会开启新的线程;
异步+串行 = 会开启新的线程,但只会创建一条新的线程,所有的任务都在这个新线程执行;
同步+并行 = 不会开启新的线程;
同步+串行 = 不会创建新的线程;
异步+主队列 = 不会开启新的线程(只要是主队列,永远都在主线程中执行);
同步+主队列 = 需要记住:同步函数不能搭配主队列使用(例外:如果同步函数是在异步函数中调用的,那么没问题)
异步函数,会先执行完所有代码,再在子线程中执行任务(block);同步函数,只要代码执行到同步函数那行,就会立即执行任务(block),只有任务执行完才会继续往后执行;
GCD其他函数
1.栅栏函数(控制任务的执行顺序)
dispatch——barrier_async(queue,^{
nslog(@"");});
栅栏函数:只有在和使用create函数自己的创建的并发队列一起使用时才有效,控制队列中任务的执行顺序,前面所有任务执行完毕后才执行栅栏函数,自己执行完毕后再执行后面任务,
2.