iOS 开发 多线程详解之线程生命周期控制
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 开发 多线程详解之线程生命周期控制相关推荐
- 详解Java线程生命周期与状态切换
前提 最近有点懒散,没什么比较有深度的产出.刚好想重新研读一下JUC线程池的源码实现,在此之前先深入了解一下Java中的线程实现,包括线程的生命周期.状态切换以及线程的上下文切换等等.编写本文的时候, ...
- Java高并发编程详解系列-线程生命周期观察者
引言 在之前的博客中我们知道,Thread提供了很多可获取的状态,以及判断是否alive的方法,但是这些方法都是线程本身提供的,在Runnable运行的过程中所处的状态是无法直接获取到的到,例如什 ...
- Java多线程详解(线程不安全案例)
嗨喽-小伙伴们我又来了, 通过前面两章的学习,我们了解了线程的基本概念和创建线程的四种方式. 附上链接: 1. Java多线程详解(基本概念) 2. Java多线程详解(如何创建线程) ...
- Spring第三天,详解Bean的生命周期,学会后让面试官无话可说!
点击下方链接回顾往期 不要再说不会Spring了!Spring第一天,学会进大厂! Spring第二天,你必须知道容器注册组件的几种方式!学废它吊打面试官! 今天讲解Spring中Bean的生命周期. ...
- iOS开发设计模式详解
在软件开发中一般认为有23种设计模式(design pattern),这是软件开发中的较高的境界了.在iOS开发中最常用的有哪些设计模式呢?我们今天来分析一下: 一.[代理模式] 使用场景:当一个类的 ...
- 详解 Flutter State 生命周期
一.说明 我们在开发 Android 或 iOS 中经常会用到页面的生命周期. Android Activity 生命周期: onCreate onStart onResume onPause onS ...
- Spring IOC详解 以及 Bean生命周期详细过程 可以硬刚面试官的文章
面试题 来自面试官发自灵魂深处的拷问:谈谈你对spring的理解: 一脸懵逼的求职者的内心活动:啥? 具体的问题是什么?现在的面试都不按套路出牌了吗? 抛出一个这么大的问题,你让我怎么回答? 一脸 ...
- Android学习之详解Activity的生命周期
Activity Activity作为Android的四大组件之一,可见其地位非同寻常,官网介绍: 移动应用体验与桌面体验的不同之处在于,用户与应用的互动并不总是在同一位置开始,而是经常以不确定的方式 ...
- 详解Vue八大生命周期钩子函数
摘要:Vue为生命周期中的每个状态都设置了钩子函数(监听函数) .每当Vue实例处于不同的生命周期时,对应的函数就会被触发调用. 本文分享自华为云社区<一文带你弄懂Vue八大生命周期钩子函数&g ...
- 苹果iOS开发系列--详解Swift 3.0语言的重大变化
概述 从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行 ...
最新文章
- win10 java applet_win10系统的ie11浏览器无法打开Java applet
- linux那个11命令是什么意思,11个有用的Linux命令
- winform改变控件的外形
- Spring cloud技术栈
- 成功解决OpenCV Error: Assertion failed (ssize.width 0 ssize.height 0) in cv::resize, file C:\proj
- 【Flask】创建一个蓝图
- OSGL 工具库 - 类型转换的艺术
- (30)Gulp 文件操作
- Netty核心组件 ChannelPipeline和ChannelHandler与ChannelHandler的入站出站规则
- RMAN中catalog和nocatalog区别
- 求职历程之-----我的求职信
- ADO.NET数据集的工作原理(DataSet)
- Spring集成Quartz定时器
- 淘宝嘉年华5元无门槛红包使用范围 怎么设置淘宝嘉年华5元无门槛红包
- 好用的轻量级UI控件库
- UML 基本模型元素
- css绝对定位的参照物
- Sql优化v-1.0
- Photoshop透明婚纱照抠图处理
- 实战技法 - 短线操盘 (11)