NSThread 是苹果官方提供的,面向对象,简单易用。程序员需要控制线程的生命周期,对线程对象进行操作。
1. 首先说一下线程的生命周期,线程的生命周期分为 创建 - 就绪 - 运行 - 堵塞 - 死亡 这五种情况,在NSThread中, 我们最主要的就是对创建, 就绪这两步进行操作。
创建:实例化一个线程对象。
就绪:将线程对象添加到可调度线程池,等待CPU调用。
运行:CPU从可调度线程池中选中线程进行调用,当前选中的线程为运行状态,未选中的重新变为就绪状态,此步程序员无法控制,由系统来处理。
堵塞:线程休眠处理。线程sleep、加了同步锁的对象正在被其他线程操作时,线程也会进入休眠。
死亡:当线程需要执行的代码块执行完,或者线程强制退出,线程结束。
2.
上代码
新建:
@available(iOS 2.0, *)
public convenience init(target: Any, selector: Selector, object argument: Any?)
@available(iOS 10.0, *)
public convenience init(block: @escaping () -> Swift.Void)
两个便利构造函数,创建一个线程对象,可以指定执行代码block、或者指定一个执行方法,方法可以传一个参数argument(可能为nil)。 (传入参数可能为nil,相对应的方法参数声明的时候就得注意,是否有必要设置可选型)
就绪:
@available(iOS 2.0, *)
open func start()
start方法,将线程对象加入可调度队列。
堵塞:
open class func sleep(until date: Date)
open class func sleep(forTimeInterval ti: TimeInterval)
类方法,当前线程进入休眠
死亡:
open class func exit()
类方法,强制结束当前线程,当前线程未执行代码不再执行。苹果官方不推荐使用,文档如下:
Invoking this method should be avoided as it does not give your thread a chance to clean up any resources it allocated during its execution.
所以当我们想结束线程是,应该通过canle()方法和isCancelled去判断,合理的对线程的执行死亡处理。
3.
我学习考虑的几个点说一下:
* 为什么sleep,exit,current等为什么是类方法或属性,并且不会出现线程错乱的情况。其实这个还是对线程了解不彻底,同一时间,只会有一个线程被cpu调用进入运行状态,这些类方法都是对当前运行的线程进行的操作,所以根本不会同时两个线程都在运行,无法判断操作哪个这种情景
*
@available(iOS 2.0, *)
open func cancel()
cancel方法不会去结束线程,实际上只是对线程进行了一个标记
@available(iOS 2.0, *)
open var isCancelled: Bool { get }
初始为false,cancel方法调用后,设为true。 我们一些逻辑判断操作可以用到这一块。
4.
补充常用一些其他的地方:
open class var current: Thread { get }
获取当前线程(经常用到)
@available(iOS 10.0, *)
open class func detachNewThread(_ block: @escaping () -> Swift.Void)
open class func detachNewThreadSelector(_ selector: Selector, toTarget target: Any, with argument: Any?)
实例化一个线程对象,并且隐式调用start(),将线程对象加入可调度线程池,进入就绪状态。