• 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];
    

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

  • 相关阅读:
    [转]实习生需要懂的40大基本规矩
    [转]Linux下pppoe配合Drcom插件上网方法介绍......
    收藏一些图书
    [转]30个自我提升技巧
    [转]关于Gmail打不开的解决办法
    [转]李开复经典语录盘点:人生之路在于每次的选择
    [转]哈佛管理世界中智慧
    胡伟武校友在2011年中国科大本科生毕业典礼暨学位授予仪式上的讲话
    Dynamics4.0和Dynamics2011处理Email的方法
    JS实现简单的ToolTip功能
  • 原文地址:https://www.cnblogs.com/CoderHong/p/8848215.html
Copyright © 2020-2023  润新知