- 一个NSThread对象就代表一条线程
- 创建、启动线程
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object: nil];
[thread start];
线程一启动,就会在线程 thread 中执行 self 的 run 方法
- 主线程相关方法
+ (NSThread *)mainThread; // 获取主线程
- (BOOL)isMainThread; // 是否为主线程
- 获取当前线程
NSThread *thread = [NSThread currentThread];
- 线程的名字
- (void)setName:(NSString *)name;
- (NSString *)name;
- 创建线程后自动启动线程
+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(nullable id)argument;
*隐式创建并启动线程
- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg;
*上述2中创建线程方式的优缺点:
1)优点:简单快捷
2)缺点:无法对线程进行更详细的设置
- 线程的状态
- 启动线程
- (void)start; //进入就绪状态 -> 运行状态。 当线程任务执行完毕,自动进入死亡状态。
- 阻塞(暂停)线程
// 进入阻塞状态
+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;
- 强制停止线程
+ (void)exit; // 进入死亡状态
注意:一旦线程停止(死亡)了,就不能再次开启任务
多线程的安全隐患
- 资源共享
1块资源可能被多个线程共享,也就是** 多个线程可能会访问同一块儿资源 ,比如多个线程访问同一对象、同一变量、同一文件。
当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题**
安全隐患解决 - 互斥锁
- 互斥锁格式
@synchronized
(锁对象) { // 需要锁定的的代码}
注意:锁定1一份代码只用1把锁,用多把锁是无效的
- 互斥锁的优缺点
1) 优点:能有效的防止因多线程抢夺资源造成的数据安全问题
2) 缺点:需要消耗大量的CPU资源
互斥锁的使用前提: 多条线程抢夺同一块资源
相关专业术语: 线程同步
线程同步的意思是:多条线程在同一条线上执行 (按顺序地执行任务),互斥锁,就是使用了线程同步技术
- OC在定义属性时有nonatomic和atomic两种选择
- atomic: 原子属性,为 setter 方法加锁 (默认是atomic),线程安全,需要消耗大量的资源
- nonatomic: 非原子属性,不会为 setter 方法加锁,非线程安全,适合内存小的移动设备
- iOS 开发建议
所有的属性都声明为 nonatomic ,尽量避免多线程抢夺同一块资源,尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力