NSThread 是苹果官方提供的,面向对象,简单易用。程序员需要控制线程的生命周期,对线程对象进行操作。

1.    首先说一下线程的生命周期,线程的生命周期分为 创建 - 就绪 - 运行 - 堵塞 - 死亡 这五种情况,在NSThread中, 我们最主要的就是对创建, 就绪这两步进行操作。

创建:实例化一个线程对象。

就绪:将线程对象添加到可调度线程池,等待CPU调用。

运行:CPU从可调度线程池中选中线程进行调用,当前选中的线程为运行状态,未选中的重新变为就绪状态,此步程序员无法控制,由系统来处理。

堵塞:线程休眠处理。线程sleep、加了同步锁的对象正在被其他线程操作时,线程也会进入休眠。

死亡:当线程需要执行的代码块执行完,或者线程强制退出,线程结束。

swift5线程阻塞 swift 线程锁_类方法

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(),将线程对象加入可调度线程池,进入就绪状态。