在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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(),将线程对象加入可调度线程池,进入就绪状态。 |
请发表评论