iOS开发系列-线程状态

概述

线程从创建到销毁中间存在很多种状态。

线程的状态

通过NSThread创建一条线程,开发者需要负责线程的创建和执行,线程的销毁由系统决定。创建一个继承NSThread的FMThread类,重写dealloc方法,验证线程对象销毁。

#import "ViewController.h"
#import "FMThread.h"
@interface ViewController ()
@end
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    FMThread *thread = [[FMThread alloc] initWithTarget:self selector:@selector(thread) object:nil];
    [thread start];
    
}

- (void)thread
{
    for (int i=0; i<5; i++) {
        NSLog(@"--------------%d", i);
    }
}
@end

在控制台输出发现线程对象的任务执行完毕,线程对象的dealloc方法执行。也就是说在线程中的任务执行完毕系统将NSThread线程对象销毁。

下面详细展示线程的状态

  • 通过NSThread创建一个线程对象,此时内存中存在该线程对象。此时的线程对象处于新建状态
  • 调用线程start方法。系统会把线程对象放入内存中的可调度线程池。此时线程对象处于就绪状态。CPU会对可调度线程池中的线程随机分配资源。
  • 当CPU调度当前线程时,该线程处于运行状态,此时线程就在执行线程中的任务。
  • 当CPU调度到其它线程对象时,该线程又回到就绪状态,等待CPU调度。
  • 调用线程的sleep或者等待同步锁操作,该线程会从可调度线程池移除。进入阻塞状态。这时候的线程不会被CPU调度
  • 当线程的sleep到时或者得到同步锁,线程又被添加进可调度线程池进入就绪状态被CPU调度。
  • 如果线程中的任务执行完毕或者程序异常退出,线程就会进入"死亡"状态。

常见的操作线程状态的方法

// 线程睡眠/堵塞两秒
 [NSThread sleepForTimeInterval:2];
[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2]];

// sleep到遥远的未来
[NSThread sleepUntilDate:[NSDate distantFuture]];

// 直接退出线程
[NSThread exit];

注意:一旦线程死亡,就不能再次开启任务。

原文地址:https://www.cnblogs.com/CoderHong/p/8848215.html