Thread

Thread的初始化

方法1

override func viewDidLoad() {
    super.viewDidLoad()

    let thread = Thread.init(target: self, selector: #selector(onThread), object: "abc")
    thread.start()//执行线程
}

func onThread(str:String) {
    print(str)
    print(Thread.current)
}

方法2

//这种方法无法拿到Thread对象
Thread.detachNewThreadSelector(#selector(onThread), toTarget: self, with: "abc")

方法3

Thread.performSelector(inBackground: #selector(onThread), with: "abc")

阻塞线程

Thread.sleep(forTimeInterval: 3)

Thread.sleep(until: Date(timeIntervalSinceNow: 5))

结束线程

Thread.exit()

互斥锁

为了防止多个线程同时操作同一个资源造成的数据混乱,在每一个线程使用资源的时候,就加一个互斥锁,就好像卫生间的门锁,有人使用的时候把门锁起

import UIKit

class ViewController: UIViewController {

    let a = 1

    lazy var thread1:Thread = {return Thread.init(target: self, selector: #selector(sellTicket), object: nil)}()
    lazy var thread2:Thread = {return Thread.init(target: self, selector: #selector(sellTicket), object: nil)}()
    lazy var thread3:Thread = {return Thread.init(target: self, selector: #selector(sellTicket), object: nil)}()

    var ticketCount = 20

    override func viewDidLoad() {
        super.viewDidLoad()

        thread1.name = "售票员A"
        thread2.name = "售票员B"
        thread3.name = "售票员C"
    }

    func sellTicket() {
        //制造一个死循环,不断重复如下内容
        while a == 1 {
            //添加互斥锁
            objc_sync_enter(self)
            if ticketCount > 0 {
                ticketCount -= 1
                print("\(Thread.current.name)卖掉一张票,还剩:\(ticketCount)票")
            } else {
                Thread.exit()
            }
            //解除互斥锁
            objc_sync_exit(self)
        }
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        thread1.start()
        thread2.start()
        thread3.start()
    }
}

线程之间的通信

...
//如果要进行下载之类的耗时操作,可以转入后台子线程执行
performSelector(inBackground: #selector(download), with: nil)

...

func download() {

    下载代码

    //当下载完毕后,需要更新UI,需要回到主线程操作
    performSelector(onMainThread: #selector(updataUI), with: nil, waitUntilDone: true)
}

results matching ""

    No results matching ""