pthread
POSIX线程(POSIX threads),简称Pthreads,是线程的POSIX标准。该标准定义了创建和操纵线程的一整套API。在类Unix操作系统(Unix、Linux、Mac OS X等)中,都使用Pthreads作为操作系统的线程。是一套C语言写的线程库.
先要包含其头文件
|
|
|
|
看代码就会发现他需要 c语言函数,这是比较蛋疼的,更蛋疼的是你需要手动处理线程的各个状态的转换即管理生命周期,比如,这段代码虽然创建了一个线程,但并没有销毁。
NSThread
这套方案是经过苹果封装后的,并且完全面向对象的。所以你可以直接操控线程对象,非常直观和方便。但是,它的生命周期还是需要我们手动管理,所以这套方案也是偶尔用用,比如 [NSThread currentThread],它可以获取当前线程类,你就可以知道当前线程的各种属性,用于调试十分方便。下面来看看它的一些用法。
创建并启动
先创建线程类,再启动
|
|
GCD
Grand Central Dispatch,听名字就霸气。它是苹果为多核的并行运算提出的解决方案,所以会自动合理地利用更多的CPU内核(比如双核、四核),最重要的是它会自动管理线程的生命周期(创建线程、调度任务、销毁线程),完全不需要我们管理,我们只需要告诉干什么就行。同时它使用的也是 c语言,不过由于使用了 Block(Swift里叫做闭包),使得使用起来更加方便,而且灵活。所以基本上大家都使用 GCD 这套方案,老少咸宜,实在是居家旅行、杀人灭口,必备良药。不好意思,有点中二,咱们继续。
任务和队列
在 GCD 中,加入了两个非常重要的概念: 任务 和 队列。
任务:即操作,你想要干什么,说白了就是一段代码,在 GCD 中就是一个 Block,所以添加任务十分方便。任务有两种执行方式: 同步执行 和 异步执行,他们之间的区别是 是否会创建新的线程。
同步(sync)和异步(async)的主要区别在于会不会阻塞当线程,直到Block中的任务执行完毕!如果是 同步(sync)操作,它会塞当前线程并等待Block中的任务执行完毕,然后当前线程才会继续往运行。如果是异步(async)操作,当前线程会直接往下执行,它不会阻塞当前线程。
队列:用于存放任务。一共有两种队列, 串行队列 和 并行队列。
放到串行队列的任务,GCD 会 FIFO(先进先出) 地取出来一个,执行一个,然后取下一个,这样一个一个的执行。
放到并行队列的任务,GCD 也会 FIFO的取出来,但不同的是,它取出来一个就会放到别的线程,然后再取出来一个又放到另一个的线程。这样由于取的动作很快,忽略不计,看起来,所有的任务都是一起执行的。不过需要注意,GCD 会根据系统资源控制并行的数量,所以如果任务很多,它并不会让所有任务同时执行。
|
|
NSOperation和NSOperationQueue
NSOperation 是苹果公司对 GCD 的封装,完全面向对象,所以使用起来更好理解。 大家可以看到 NSOperation 和 NSOperationQueue 分别对应 GCD 的 任务 和 队列
NSOperation是一个抽象的类,并不具备封装操作的能力,必须使用它的子类:
操作步骤也很好理解:
先将需要执行的操作封装到一个NSOperation对象中
将NSOperation对象添加到NSOperationQueue中
系统会自动将NSOperationQueue中的NSOperation取出来
将取出来的NSOperation封装的操作放到一条线程中去执行
NSOperationQueue的作用
如果将NSOperation添加到NSOperationQueue中,系统会默认异步执行NSOperation的操作
添加NSOperation到NSOperationQueue中
|
|
没有添加到NSOperationQueue的情况
|
|
添加到NSOperationQueue的情况
|
|
NSOperation通信与依赖关系
|
|
NSOperation并发数与挂起
最大并发数
若是开启线程较多,会增大CPU工作量,从而降低了每个线程被调用的次数.为了合理的提高CPU的工作效率,我们可以设置队列最大并发数.
|
|
|
|
队列的挂起与取消
挂起
suspended:将其赋值为YES即挂起,赋值为NO即恢复
当线程处于执行状态,设置队列挂起时不会影响其执行,受影响的是那些还没有执行的任务
当队列设置为挂起状态后,可以修改其状态再次恢复任务
取消
设置取消的方法是cancelAllOperations,当取消任务后不可以恢复
若任务操作时自定义的NSOperation类型的话,执行完一个耗时操作后需要加一是否取消任务的判断,再去执行另外一个耗时操作.同样取消不影响当前正在执行的线程,后面的线程会被取消.
|
|
|
|