zoukankan      html  css  js  c++  java
  • 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];
    

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

  • 相关阅读:
    uniapp开发微信小程序
    requests自动登录禅道并提交bug 测试
    [转载]使用CPU时间戳进行高精度计时
    lu面
    音量控制面板项目说明
    【转载】粤语翻译工具
    专业操盘手的买卖法则
    自动刷新查询火车票脚本
    股东权益和权益比
    异形魔方SQ1的暴力解法
  • 原文地址:https://www.cnblogs.com/CoderHong/p/8848215.html
Copyright © 2011-2022 走看看