进程(Process):系统中正在进行的一个应用程序(至少有一个线程,即为主线程)。
线程(Thread):程序的一段执行序列,是进程的一部分(轻量级进程)。
需要同时执行多个任务时就需要多线程,比如软件的下载,微信,浏览器。
并不是线程越多越好,因为开线程需要占用内存空间(默认主线程占用1M,子线程占用512KB)。开启多个线程CPU会在多条线程中调度,会消耗大量CPU资源。每条线程被调度执行的频率也会变低,程序设计的复杂度也会相对变高。
iOS多线程技术
1.PThread
几乎不用,提供了基于C语言的API,使用难度较大,需要开发者手动创建并销毁线程,可以自定义的功能较少
2.NSTread
偶尔使用,提供了基于OC的接口,使用PThread较简单,面向对象,需要自己管理线程的生命周期,线程的同步,加锁,开锁等情景。相对管理多个线程时较困难。
3.GCD(Grand Central Dispatch)
经常使用,基于C语言的底层的接口,使用block定义任务,使用起来灵活方便,开发者不用直接与线程打交道,只需要向队列中添加block即可
GCD中有三种队列类型:
The main queue:与主线程功能相同。实际上,提交至main queue的任务会在主线程中执行。main queue可以调用dispatch_get_main_queue()来获得。因为main queue是与主线程相关的,所以这是一个串行队列。
Global queues:全局队列是并发队列,并由整个进程共享。进程中存在三个全局队列:高、中(默认)、低三个优先级队列。可以调用dispatch_get_global_queue函数传入优先级来访问队列。
用户队列:用户队列 (GCD并不这样称呼这种队列, 但是没有一个特定的名字来形容这种队列,所以我们称其为用户队列) 是用函数 dispatch_queue_create
创建的队列. 这些队列是串行的。正因为如此,它们可以用来完成同步机制, 有点像传统线程中的mutex。
4.NSOperation
经常使用,面向对象的多线程技术,在GCD之上的OC的接口,提供了在GCD中不太容易实现的特性