一 什么是多线程
1. 什么是进程
进程:
系统中运行的独立的一个应用程序; 每个进程均运行在专门受保护的内存空间中: 比如MAC中同时开着Xcode和QQ, 就是两个进程。
2. 什么是线程
线程:
一个进程要想执行任务, 必须的有线程(每一个进程至少有一个线程),
线程是进程的基本执行单元, 一个进程中所有的任务都是在线程中执行的. 比如说任务的下载, 音乐播放等.
3. 线程的串行
一个线程中的任务是串行的, 如果要在一个线程中执行多个任务, 任务就必须一个一个按照顺序执行.
4. 多线程
一个进程中可以开启多个线程, 每条线程可以同时并行执行不同的任务, 多线程可以提高程序的执行效率.
比如: 3个文件下载任务,
在一个线程中, 只能一个任务下载完成以后再下载下一个,
多线程就可以开3个线程, 可以同时下载3个任务.
5. 多线程的优缺点
优点:
能适当提高程序的执行效率
能够适当提高资源的利用率(CPU, 内存利用率);
缺点:
开启线程需要占用一定的内存空间, 如果开启大量的线程,会占用大量的内存空间,降低程序的性能
线程越多, CPU在调度线程上的开销就越大.
多线程在iOS中的应用
主线程:一个iOS程序运行后, 会默认开启一条线程, 成为主线程或者为UI线程, 其作用就是显示或者刷新UI界面, 处理UI事件.
主线程使用注意: 别将耗时操作放在主线程, 否则会造成卡顿.
二 在iOS中有多线程的实现方案:
1 Pthread: 需要程序员管理, 现在几乎不用.
- 是一套通用的多线程API
- 适用于Unix/Linux/Windows等系统
- 跨平台/可移植
- C 语言, 难度大
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[self pthreadDemo];
}
-(void)pthreadDemo
{
/*
pthread 属于POSIX 多线程开发框架
参数
1:指向线程的指针
2:线程属性
3:指向函数的指针
4:传递给函数的参数
*/
NSString *str = @"LFFW";
pthread_t threadID;
int result = pthread_create(&threadID, NULL, &demo, (__bridge void *)(str));
if(result == noErr)
{
NSLog(@"OK");//1
}else
{
NSLog(@"error:%d",result);
}
}
void * demo(void *param)
{
NSLog(@"%@,%@",[NSThread currentThread],param);
return NULL;
}
2 NSThread: OC语言, 程序员管理线程
- OC语言, 更加面向对象使用
- 简单易用, 可以直接操作线程对象
//取消线程
- (void)cancel;
//启动线程
- (void)start; //常用
//判断某个线程的状态的属性
@property (readonly, getter=isExecuting) BOOL executing;
@property (readonly, getter=isFinished) BOOL finished;
@property (readonly, getter=isCancelled) BOOL cancelled;
//设置和获取线程名字
-(void)setName:(NSString *)n;
-(NSString *)name;
//获取当前线程信息
+ (NSThread *)currentThread; // 常用
//获取主线程
+ (NSThread *)mainThread;
//从现在起睡多少秒
+ (void)sleepForTimeInterval:(NSTimeInterval)time;
//从现在起睡到指定的日期
+ (void)sleepUntilDate:(NSDate *)date;
//一旦强行终止线程,后续的所有代码都不会被执行
//注意:在终止线程之前,应该注意释放之前分配的对象
[NSThread exit]; //主线程使用, 会死;
2.1 资源共享-互斥锁
- 保证了锁内的代码, 在同一时间, 只有一个线程执行任务
- 互斥锁的锁定范围越小越好, 范围越大, 效率越差
参数:- 能够加锁的任意NSObject对象
- 注意: 锁的对象一定要能够保证所有线程访问
- 如果代码中只有一个地方需要加锁,大多都使用 self,这样可以避免单独再创建一个锁对象
2.2 资源共享-原子属性
原子属性:
如果不写atomic,多线程写入属性时,保证同一时间只有一个线程能够写入操作;
单(线程)写,多(线程)读技术。线程安全:多个线程操作数据,仍然能保证数据正确
实际上,原子属性内部会有一把锁;自旋锁
共同点:
同一时间,只有一个线程访问;
不同点:
互斥锁:如果发现其他线程正在执行锁定的代码,线程就会进入休眠状态,等待线程完成,就唤醒
自旋锁:如果发现其他线程正在执行锁定的代码,线程就会死循环模式,等待线程完成,就执行锁定代码;
2 GCD: OC语言, 自动管理线程, 经常使用
- 为了替代NSThread等线程技术
- 充分利用了多核技术
3 NSOperation: OC语言, 自动管理, 经常使用
- 底层是GCD
- 比GCD多了一些简单实用的功能
- 使用更加面向对象
下面会重点详细写GCD 和NSOperation的用法