- 原文链接:iOS多线程--彻底学会多线程之『pthread、NSThread』
- **NSThread **是苹果官方提供的,使用时需要程序员管理线程的声明周期(主要是创建),开发中我们经常会使用到
[NSThread currentThread]
来显示当前的进程信息。
1.创建、启动线程
- 方式1:先创建线程,再手动启动线程
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[thread start]; //线程一启动,就会在thread中执行self的run方法;
- 方式2:创建线程后自动启动线程
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
- 方式3:隐式创建并启动线程
[self performSelectorInBackground:@selector(run) withObject:nil];
2.线程相关用法:
//获得主线程
+ (NSThread *)mainThread;
//判断是否为主线程(对象方法)
- (BOOL)isMainThread;
//获得当前线程
NSThread *current = [NSThread currentThread];
//线程的名字--setter方法
- (void)setName:(NSString *)n;
//线程的名字--getter方法
- (NSString *)name;
3. 线程状态控制方法
- 启动线程方法
- (void)start; //线程从就绪状态 -> 运行状态;当线程任务执行完毕,自动进入死亡状态;
- 阻塞(暂停)线程方法
+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterVal:(NSTimeInterval)ti;
- 强制停止线程
+ (void)exit; //线程进入死亡状态;
4. 线程的状态转换
- 当我们新建一条线程
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
,在内存中的表现如下图:
- 当我们调用了
[thread start];
后,系统把线程对象放入可调度线程池中,线程对象进入就绪状态,如下图:
- 当然可调度线程池中,也会其他对象,如下图:
线程状态的几种转换
- 如果CPU调度当前线程对象,当前线程对象进入运行状态,如果CPU调度其他线程对象,当前线程对象回到就绪状态;
- 如果CPU在运行当前线程对象时调用了sleep方法/等待同步锁,则当前线程对象进入阻塞状态;等到sleep结束/得到了同步锁,则回到就绪状态;
- 如果CPU运行当前线程对象时任务执行完毕/异常强制退出,则当前线程对象进入死亡状态。
具体变化如下图: