一.相关概念
1.进程
进程是指在系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内。
2.线程
线程是进程的基本单元,一个进程(程序)的所有任务都在线程中执行。1个线程中任务的执行是串行的。如果要在这个线程中执行多个任务,那么智能一个一个地按顺序执行这些任务,也就是说,在同一时间内,一个线程只能执行一个任务
3.同步
不开启新的线程,会堵塞当前线程
4.异步
开启新的线程,不会堵塞当前线程
5.串行
按顺序执行,前一个任务结束后一个任务开始
6.并行
多个任务同时执行
7.多线程
1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务。同一时间,CPU只能处理1条线程,只有1条线程在工作(执行)。多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换)。CPU调度线程的速度足够快,就造成了多线程并发执行的假像。
二.线程与runloop关系
每条线程都有一个和他对应的runloop,线程刚创建的时候是没有runloop如果不主动获取是不会有的,主线程是默认除外
Runloop保存在一个全局字典中,线程为key,runloop为value,Runloop创建是放生在第一次获取时,销毁是线程结束时
三.多线程使用场景
设计到耗时的操作都可以使用多线程
比如网络请求,读取文件,数据库操作,文件上传下载等等
四.多线程优缺点
优点:1、能适当提高程序的执行效率
2、能适当提高资源利用率(CPU、内存利用率)
缺点:
1、开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB),如果开启大量的线程,会 占用大量的内存空间,降低程序的性能。
2、线程越多,CPU在调度线程上的开销就越大(如果有N条多线程,cpu会在N多线程之间调度,CPU会累死,消耗大量的CPU资源,每条线程被调度执行的频次会降低,线程的执行效率就下降了)
3、程序设计更加复杂:比如线程之间的通信,多线程的数据共享
五.iOS多线程方案
1.perSelector
//主线程执行
[self performSelectorOnMainThread:@selector(test) withObject:nil waitUntilDone:NO];
//异步执行,不使用NSThread,gcd,NSOperation实现异步执行
//开启新的线程在后台执行
[self performSelectorInBackground:@selector(test) withObject:nil];
//指定线程执行
[self performSelector:@selector(test) onThread:[NSThread currentThread] withObject:nil waitUntilDone:NO];
2.pthread 底层的C线程库(不考虑)
3.NSThread Objective-C的线程类
4.NSOperationQueue 线程池/线程队列
5.GCD 使用Block语法的线程池/线程队列