一.线程和进程
进程::系统中正在运行的一个程序,每个程序独立运行在自己特定的受保护的内存空间内。
从活动监视器上可以很直观的看到正在运行的进程名称,和占得CPU百分比。
线程:一个进程想要执行任务,必须有线程,每一个进程最少有一条线程。线程是进程的基本执行单元,一个进程的所有任务都在线程中执行。
可以看出有3个线程
二.线程的串行和并行
串行:在一个线程中执行多个任务,会按照顺序一个一个去执行。在同一时间内,只会执行一个任务。
并行:在一个线程执行多个任务时,会同时执行多个不同的任务。
多线程的原理:同一时间,CPU只能处理一条线程,只有一条线程在执行。多线程执行,是CPU快速的在多线程之间调度。如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象。
三.多线程的优缺点
优点:能够适当提高程序的执行效率,能适当的提高资源利用率(CPU,内存利用率)
缺点:开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB),如果大量开启线程,会占用大量内存空间,降低程序的性能线程越多,CPU在调度线程的开销就越大.程序设计会更加复杂,比如线程之间的通讯,多线程的数据共享。
四:多线程开发中的运用
在程序运行后会默认开启一条线程,称为主线程或UI线程,主要负责UI的刷新,处理UI事件.
而在子线程负责数据的加载处理。
主线程使用注意:耗时操作别放到主线程中,耗时操作会严重影响UI的流畅度,给用户一种“卡”的体验.
五.代码示例:
我们在storyboard中拖入开关控件,或者滑动条控件.
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event{
[self performSelectorInBackground:@selector(longOperation) withObject:nil];
}
- (void)longOperation{
NSLog(@"start");
for (int i = 0; i < 1000000; ++i) {
NSLog(@"%d",i);
}
NSLog(@"end");
}
如果在主线程中调用longOperation方法,由于在方法中我们打印i的值.这个操作是耗时操作.会大量消耗CPU性能.当运行程序,我们点击storyboard中的控件时,会发现控件没有进行响应,给用户“卡”的体验.而当我们开启子线程,将longOperation放入子线程中,再点击控件时,控件进行响应动作.