【iOS】从实际出发理解多线程(一)
多线程是开发中一个很重要的模块,但在很多时候,尤其是刚开始开发时理解的不是很透彻,只有在慢慢地积累后,才能更好地理解它。在现在闲的时候,我就把我的理解说一下。
本篇文章就先讲一下一些概念,接下来的几篇文章会分开讲述多线程的详细内容。
容易混淆绕晕的概念:
进程:进程是线程的容器,你打开一个APP就是打开了一个进程。微信有微信的进程,微博有微博的进程。一个进程可以包含多个线程。
通俗理解进程就是一条高速公路,线程就是高速路上的一条条车道。也就是因为这些车道,整个交通的运行效率变得更高,也正是以为有了多线程,系统的运行效率变得更高。
线程:线程是在进程中我们开辟的一条条为我们做事的进程实体,通俗来说,线程就是我们在进程上开辟的一条条做我们想做的事的通道。一条线程在一个时间点上只能做一件事,多线程在同一时间点上就能做多件事。
通俗理解一条高速公路是一个进程,一条条车道就是不同的线程,再过收费站时,这条进程要是只有一条线程,即一条高速公路上只有一个车道,那就只能排队一辆一辆通过,同一时间不能有两辆车一起过去。但是如果一个进程上有多个线程,即一条高路公路上有多个车道,这样同一时间就完全可能有多辆车一起通过了。
同步线程:同步线程会阻塞当前的线程去执行同步线程里面想做的任务,执行完之后才会返回当前线程。
异步线程:异步线程不会阻塞当前的线程去执行异步线程里想做的任务,因为是异步,所以他会重新开启一个线程去做任务。
队列:队列是用来管理下面所说的任务的,它采用的是先进先出(FIFO)的原则,他衍生出的就是并行和串行队列,一个线程上可以有多个队列。
并行队列:这个队列里的任务是可以并发(同时)执行的,由于同步执行任务不会开启新的线程,所以并行队列同步执行任务只会在一条线程里面同步执行任务。又由于同步执行也就在在当前线程中做事,这是就需要一件一件的做任务(做完一个在做下一个)。单要是并发队列异步执行,就对应着开启异步线程执行要做的任务,就会同一时间有很多的任务被做着。
串行队列:这个队列里的任务是串行,也就是一件件执行的,串行同步会一件一件的等任务做完再接着做下一件,要是异步就会开启一条新的线程串行执行我们的任务。
任务:就是我们需要做的事。
同步任务:不需要开启新的线程,在当前线程执行就可以。
异步任务:需要开辟一个新的线程去异步的执行这个任务。
iOS中还有一个特殊的串行队列--主队列,这个主队列中还有一个特殊的线程--主线程。
主线程:又名UI线程,顾名思义主要的任务就是及时处理UI,也只有主线程有处理UI的能力,其他的耗时操作我们就放在子线程(即开辟线程)去执行,开线程也会占据一定的内存,所以不要同时开启很多个线程。