本人做开发有五年多了,自己在平时开发中总结了不少的东西,以及通用功能,平实比较喜欢写代码,很少有写博客,今天我就来和大家总结下iOS中的多线程,首先来说一下多线程中的NSthread
什么是线程
进程是指在系统中运行的程序,每个程序都是运行在独立的内存空间下,每个程序必定有一个或者多个任务要执行,而任务就必须要线程去去执行,每个进程至少有一个以上的线程,线程是进程的最基本单位。
为什么要用多线程开发
优点:
1.一个 CPU 在同一时间时候谁能处理一条线程,采用多线程可以适当的提高程序的运行效率,充分提高CPU 利用率
2.可以适当的提高运行速度,提高产品的用户体验。
3.多任务时,可以设定任务的优先级
4.多线程可以同时(相对的)处理多个数据
缺点:
1.开启一个需要占用一定的内存空间
2.对CPU的要求更多额外的开销
3.程序设计代码开发相对更加复杂
4.容易造成线程死锁(多线程同时共享同一数据时)
iOS 中线程对比
名称 | 简介 | 优点 | 缺点 | 使用频率 |
---|---|---|---|---|
pthread | C语言写的一套多线程API | 基于C语言,跨平台 | 生命周期都要程序员去处理,C语言面向过程,代码相对复杂,不易维护 | 使用很少 |
NSThread | OC 对象语言 | 面向对象,简单易用 | 生命周期都要程序员去处理 | 使用比较少 |
GCD | 基于C语言封装的多线程API | GCD更接近底层,性能更好,速度是最快的,自动管理生命周期 | GCD需要自己写更多的代码来实现,结合block来写,代码更简洁 | 常用 |
NSoperation | 底层基于GCD写的多线程API | 代码比GCD更简洁,更多了一些简单实用的功能,实用面向对象,自动管理生命周期 | 相对于GCD,GCD 的并发能力更高一点 | 常用 |
NSthread 代码实现
- 方法1
//1.创建子线程 (线程自动执行)
[self performSelectorInBackground:@selector(NSthreadRun:) withObject:@" 后台"];
- 方法2
//1.创建子线程 (线程自动执行)
[NSThread detachNewThreadSelector:@selector(NSthreadRun:) toTarget:self withObject:@"哈哈"];
- 方法3
//1.实例华对象 需要调用start才能执行
NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(NSthreadRun:) object:@""];
//2.设置线程名称
thread.name=@"thread 1";
//3.调度优先级的取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高
thread.threadPriority=0.1;
//4.启动线程 在新开的形成执行run 方法
[thread start];
//5.获取当前线程
NSThread *current = [NSThread currentThread];
//6.获取主要线程
NSThread *main = [NSThread mainThread];
//7.程休眠 单位毫秒
[NSThread sleepForTimeInterval:20];
//8.退出线程
[NSThread exit];
多线程的安全隐患问题
加锁(对象同一时间只能由一个线程操作)
nonatomic 非原子属性
atomic 原子属性–默认属性
原子属性就是针对多线程设计的。 原子属性实现 单(线程)写 多(线程)读
“atomic(原子属性)在set方法内部加了一把自旋锁”
“nonatomic(非原子属性)下,set和get方法都不会加锁”设置对象属性原子性(不可 拆分)
加锁
@synchronized(obj) {
//处理线程任务
NSLog(@"%d-------%@",i,[NSThread currentThread]);
}
原子性
@synthesize obj = _obj;
- (NSObject *)obj {
return _obj;
}
- (void)setObj:(NSObject *)obj {
@synchronized(self) {
_obj = obj;
}
}