概述

线程从创建到销毁中间存在很多种状态。

线程的状态

通过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];

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

iOS开发系列-线程状态的更多相关文章

  1. iOS开发系列-线程同步技术

    概述 多线程的本质就是CPU轮流随机分配给每条线程时间片资源执行任务,看起来多条线程同时执行任务. 多条线程同时访问同一块资源,比如操作同一个对象.统一变量.同一个文件,就会引发数据错乱和数据安全的问 ...

  2. iOS开发系列-网络状态监控

    概述 在网络应用中,需要对用户设别的网络状态进行实时监控,可以让用户了解自己的网络状态出现网络问题提示用户. 一般在网络状态不好的场景下需要做一些处理比如: WIFT/3G/4G网络:自动下载高清图. ...

  3. iOS开发系列--通知与消息机制

    概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...

  4. iOS开发系列--数据存取

    概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...

  5. iOS开发系列--网络开发

    概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力 ...

  6. iOS开发系列--并行开发其实很容易

    --多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的, ...

  7. 【转】iOS开发系列--数据存取

    原文: http://www.cnblogs.com/kenshincui/p/4077833.html#SQLite 概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储 ...

  8. iOS开发系列--通知与消息机制--转

    来自:http://www.cocoachina.com/ios/20150318/11364.html 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户 ...

  9. iOS开发系列之app的一天

    本文主要讲述我对 iOS 开发的一些理解,希望能通过 app 从启动到退出,将一些的知识整合起来,形成一条知识链,目前涉及到的知识点有 runloop.runtime.文件存储.界面布局.离线推送.内 ...

随机推荐

  1. thinkphp 动态配置

    之前的方式都是通过预先定义配置文件的方式,而在具体的操作方法里面,我们仍然可以对某些参数进行动态配置(或者增加新的配置),主要是指那些还没有被使用的参数. 设置新的值: C('参数名称','新的参数值 ...

  2. kafka拦截器原理|案例实操

    拦截器原理 Producer拦截器(interceptor)是在Kafka 0.10版本被引入的,主要用于实现clients端的定制化控制逻辑. 对于producer而言,interceptor使得用 ...

  3. java 直接调用micorosoft office (2003-2007和2010版本)中excel中计算函数

    主要是讲述java中poi读取excel,而excel的版本包括:2003-2007和2010两个版本, 即excel的后缀名为:xls和xlsx 读取excel和MySQL相关: java的poi技 ...

  4. JVM内核-原理、诊断与优化学习笔记(二):JVM运行机制

    文章目录 JVM启动流程 PC寄存器 方法区 保存装载的类信息 通常和永久区(Perm)关联在一起 Java堆 Java栈 Java栈 – 局部变量表 ** 包含参数和局部变量 ** Java栈 – ...

  5. 了解Metasploit中的Payloads(有效载荷)

    什么是payload? payload又称为攻击载荷,主要是用来建立目标机与攻击机稳定连接的,可返回shell,也可以进行程序注入等.也有人把payloads称 为shellcode. Shellco ...

  6. subId、slotId、SubscriptionInfo和SubscriptionManager的解释及关系说明

    1. subid和slotid(phoneid) slotid(phoneid)是指卡槽:双卡机器的卡槽1值为0,卡槽2值为1,依次类推. subid:SubscriptionId(Subscript ...

  7. 纯CSS3制作的“Ribbons”效果

    在看具体每个demo之前,我们一起来看下面一个截图: 上图是一个典型的“Ribbons”各部位的示意图,但每一个“Ribbons”并不会都使用上图示意的各个部分,在下面的实例中大家可以明显的看 到或者 ...

  8. decimate、end、interp、resample工具箱函数

  9. shell 命令 进程相关

     1. 进程标识号PID 唯一性 pid 为0    内核进程,linux内核创建 pid 为1    init进程,系统最早创建的进程,init是所有用户进程的祖先 2. 查看系统进程信息 (1)[ ...

  10. boost 条件变量

    // boost 条件变量 // 做个简单的笔记 #include <boost/thread/mutex.hpp> #include <boost/thread/condition ...