多线程之线程的状态

本文深入探讨了线程状态的定义与转换,包括新建、就绪、运行、阻塞和死亡状态,以及如何通过sleep和synchronized方法实现线程的阻塞。同时,文章还介绍了如何在Objective-C中终止线程,强调了在终止前释放资源的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程状态

线程状态

  • 新建
    • 实例化线程对象
  • 就绪
    • 向线程对象发送 start 消息,线程对象被加入 可调度线程池 等待 CPU 调度
    • detachNewThreadSelector 方法和 performSelectorInBackground 方法会直接实例化一个线程对象并加入 可调度线程池
  • 运行
    • CPU 负责调度可调度线程池中线程的执行
    • 线程执行完成之前(死亡之前),状态可能会在就绪运行之间来回切换
    • 就绪运行之间的状态变化由 CPU 负责,程序员不能干预
  • 阻塞
    • 当满足某个预定条件时,可以使用休眠或锁阻塞线程执行
      • sleepForTimeInterval:休眠指定时长
      • sleepUntilDate:休眠到指定日期
      • @synchronized(self):互斥锁
  • 死亡
    • 正常死亡
      • 线程执行完毕
    • 非正常死亡
      • 当满足某个条件后,在线程内部自己中止执行(自杀)
      • 当满足某个条件后,在主线程给其它线程打个死亡标记(下圣旨),让子线程自行了断.(被逼着死亡)

代码

- (void)statusDemo {

    NSLog(@"先睡会");
    [NSThread sleepForTimeInterval:1.0];

    for (int i = 0; i < 20; i++) {
        if (i == 9) {
            NSLog(@"再睡会");
            [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]];
        }

        NSLog(@"%d %@", i, [NSThread currentThread]);

        if (i == 16) {
            NSLog(@"88");
            // 终止线程之前,需要记住释放资源
            [NSThread exit];
        }
    }
    NSLog(@"over");
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    // 注意不要在主线程上调用 exit 方法
//    [NSThread exit];

    // 实例化线程对象(新建)
    NSThread *t = [[NSThread alloc] initWithTarget:self selector:@selector(statusDemo) object:nil];

    // 线程就绪(被添加到可调度线程池中)
    [t start];
}

小结

阻塞
  • 方法执行过程,符合某一条件时,可以利用 sleep 方法让线程进入 阻塞 状态

    • sleepForTimeInterval 从现在起睡多少
    • sleepUntilDate 从现在起睡到指定的日期
死亡
[NSThread exit];
  • 一旦强行终止线程,后续的所有代码都不会被执行
  • 注意:在终止线程之前,应该注意释放之前分配的对象!

注意:线程从就绪运行状态之间的切换是由 CPU 负责的,程序员无法干预


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值