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)
}