0.线程状态

新建 --> 就绪(在可调度线程池中,等待被CPU的调度执行) --> 运行
运行 --> CPU切换到其他的线程 --> 就绪
运行 --> 调用的sleep方法 --> 阻塞 --> sleep的时间到了 --> 就绪
运行 --> 任务执行完成 --> 死亡
运行 --> exit --> 死亡

1.新建

内存中创建了一个线程对象

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadDemo) object:nil];

2.就绪

将线程放进可调度线程池,等待被CPU调度

[thread start];

3.运行

CPU负责调度”可调度线程池”中的处于”就绪状态”的线程
线程执行结束之前,状态可能会在”就绪”和”运行”之间来回的切换
“就绪”和”运行”之间的状态切换由CPU来完成,程序员无法干涉

4.阻塞

正在运行的线程,当满足某个条件时,可以用休眠或者锁来阻塞线程的执行

1.sleepForTimeInterval:休眠指定时长
[NSThread sleepForTimeInterval:1.0];2.sleepUntilDate:休眠到指定日期
[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]];3.互斥锁
@synchronized(self)

5.死亡

  • 正常死亡:线程执行结束
  • 非正常死亡:程序突然崩溃/当满足某个条件后,在线程内部强制线程退出,调用exit方法

代码演练

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{// 新建状态NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadDemo) object:nil];// 就绪状态 : 将线程放进"可调度线程池",等待被CPU调度.[thread start];// 主线程中的危险操作,不能在主线程中调用该方法.会使主线程退出
//    [NSThread exit];
}- (void)threadDemo
{for (int i = 0; i < 6; i++) {NSLog(@"%d",i);//1. 当前线程,每循环一次,就休眠一秒[NSThread sleepForTimeInterval:1.0];//2. 满足某一条件再次休眠一秒if (2==i) {NSLog(@"我还想再睡一秒");// 休眠时间为从现在开始计时多少秒以后[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]];}//3. 满足某一条件线程死亡if (4==i) {NSLog(@"线程死亡");// 在调用exit方法之前一定要注意释放之前由C语言框架创建的对象.CGMutablePathRef path = CGPathCreateMutable();CGPathRelease(path);// 线程死亡[NSThread exit];// 当线程死亡之后,以后的代码都不会被执行NSLog(@"线程已经死亡");}}NSLog(@"循环结束");
}

关于exit的结论

  • 使当前线程退出.
  • 不能在主线程中调用该方法.会使主线程退出.
  • 当当前线程死亡之后,这个线程中的代码都不会被执行.
  • 在调用此方法之前一定要注意释放之前由C语言框架创建的对象.

iOS 开发 多线程详解之线程生命周期控制相关推荐

  1. 详解Java线程生命周期与状态切换

    前提 最近有点懒散,没什么比较有深度的产出.刚好想重新研读一下JUC线程池的源码实现,在此之前先深入了解一下Java中的线程实现,包括线程的生命周期.状态切换以及线程的上下文切换等等.编写本文的时候, ...

  2. Java高并发编程详解系列-线程生命周期观察者

    引言   在之前的博客中我们知道,Thread提供了很多可获取的状态,以及判断是否alive的方法,但是这些方法都是线程本身提供的,在Runnable运行的过程中所处的状态是无法直接获取到的到,例如什 ...

  3. Java多线程详解(线程不安全案例)

    嗨喽-小伙伴们我又来了, 通过前面两章的学习,我们了解了线程的基本概念和创建线程的四种方式. 附上链接: 1.  Java多线程详解(基本概念)​​​​​​​ 2. Java多线程详解(如何创建线程) ...

  4. Spring第三天,详解Bean的生命周期,学会后让面试官无话可说!

    点击下方链接回顾往期 不要再说不会Spring了!Spring第一天,学会进大厂! Spring第二天,你必须知道容器注册组件的几种方式!学废它吊打面试官! 今天讲解Spring中Bean的生命周期. ...

  5. iOS开发设计模式详解

    在软件开发中一般认为有23种设计模式(design pattern),这是软件开发中的较高的境界了.在iOS开发中最常用的有哪些设计模式呢?我们今天来分析一下: 一.[代理模式] 使用场景:当一个类的 ...

  6. 详解 Flutter State 生命周期

    一.说明 我们在开发 Android 或 iOS 中经常会用到页面的生命周期. Android Activity 生命周期: onCreate onStart onResume onPause onS ...

  7. Spring IOC详解 以及 Bean生命周期详细过程 可以硬刚面试官的文章

    面试题 来自面试官发自灵魂深处的拷问:谈谈你对spring的理解: 一脸懵逼的求职者的内心活动:啥?  具体的问题是什么?现在的面试都不按套路出牌了吗?  抛出一个这么大的问题,你让我怎么回答? 一脸 ...

  8. Android学习之详解Activity的生命周期

    Activity Activity作为Android的四大组件之一,可见其地位非同寻常,官网介绍: 移动应用体验与桌面体验的不同之处在于,用户与应用的互动并不总是在同一位置开始,而是经常以不确定的方式 ...

  9. 详解Vue八大生命周期钩子函数

    摘要:Vue为生命周期中的每个状态都设置了钩子函数(监听函数) .每当Vue实例处于不同的生命周期时,对应的函数就会被触发调用. 本文分享自华为云社区<一文带你弄懂Vue八大生命周期钩子函数&g ...

  10. 苹果iOS开发系列--详解Swift 3.0语言的重大变化

    概述 从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行 ...

最新文章

  1. win10 java applet_win10系统的ie11浏览器无法打开Java applet
  2. linux那个11命令是什么意思,11个有用的Linux命令
  3. winform改变控件的外形
  4. Spring cloud技术栈
  5. 成功解决OpenCV Error: Assertion failed (ssize.width 0 ssize.height 0) in cv::resize, file C:\proj
  6. 【Flask】创建一个蓝图
  7. OSGL 工具库 - 类型转换的艺术
  8. (30)Gulp 文件操作
  9. Netty核心组件 ChannelPipeline和ChannelHandler与ChannelHandler的入站出站规则
  10. RMAN中catalog和nocatalog区别
  11. 求职历程之-----我的求职信
  12. ADO.NET数据集的工作原理(DataSet)
  13. Spring集成Quartz定时器
  14. 淘宝嘉年华5元无门槛红包使用范围 怎么设置淘宝嘉年华5元无门槛红包
  15. 好用的轻量级UI控件库
  16. UML 基本模型元素
  17. css绝对定位的参照物
  18. Sql优化v-1.0
  19. Photoshop透明婚纱照抠图处理
  20. 实战技法 - 短线操盘 (11)

热门文章

  1. Android混淆规则
  2. PCQQ official算法逆向
  3. WINCE环境下 helloWorld
  4. 现场抽奖小程序_抽奖小程序助手转盘活动微信抽奖系统
  5. 加工中心计算机编程自学,如何快速学习数控加工中心编程
  6. 阿里云服务器搭建fastdfs
  7. 3D建模、处理软件及部分算法库简介
  8. CubeMX编写风力摆控制系统[HAL库]
  9. kindle我的剪帖文件整理脚本
  10. lux视频下载工具的安装和使用