import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//获取当前线程数
let currentThread = Thread.current
print("当前线程\(currentThread)")
// 获得应用程序的主线程
let mainThread = Thread.main
// 应用程序的主线程:<NSThread: 0x7c973710>{number = 1, name = main}
print("应用程序的主线程:\(mainThread)")
// 判断当前线程是否是主线程
let isMain = Thread.isMainThread
print(isMain) // return:true
/** 模拟售票机制 */
let st = SecurityThread()
st.Sellticket()
}
/**
创建线程
说明:此处列出创建线程的四种方法:分别是
*/
// NSThread创建线程的四种方式
func createNewThreadWithNSThreadMethodOne() {
// 创建线程
let thread = Thread.init(target: self, selector: #selector(ViewController.run), object: nil)
// 设置线程的名称
thread.name = "线程A"
// 启动线程
thread.start()
}
func createNewThreadWithNSThreadMethodTwo() {
// 分离出一条子线程,自动启动线程,但无法获得线程对象
Thread.detachNewThreadSelector(#selector(ViewController.run), toTarget: self, with: nil)
}
func createNewThreadWithNSThreadMethodThree() {
// 开启一条后台线程,自动启动线程,但无法获得线程对象
self.performSelector(inBackground: #selector(ViewController.run), with: nil)
}
func createNewThreadWithNSThreadMethodFour() {
// let thread = CustomThread()
// thread.start()
//
}
/** 休眠或者退出 */
func exitorsleep() {
// 程的退出
Thread.exit()
// 线程的休眠1
Thread.sleep(forTimeInterval: 2.0)
// 线程的休眠2
Thread.sleep(until: NSDate.init(timeIntervalSinceNow: 3.0) as Date)
}
func run() {
// 获得当前执行run方法的线程
let thread = Thread.current
print("run--\(thread.name)-\(thread)")
}
/** 模拟售票 */
class SecurityThread {
var totalTickets = 100
func Sellticket() {
// 多线程访问资源加锁
// 创建三条线程分别代表售票员A、售票员B、售票员C
let thread01 = Thread.init(target: self, selector: #selector(SecurityThread.saleTickect), object: nil)
let thread02 = Thread.init(target: self, selector: #selector(SecurityThread.saleTickect), object: nil)
let thread03 = Thread.init(target: self, selector: #selector(SecurityThread.saleTickect), object: nil)
// 设置线程的名称
thread01.name = "售票员A"
thread02.name = "售票员B"
thread03.name = "售票员C"
// 开启线程
thread01.start()
thread02.start()
thread03.start()
}
// 模拟售票的函数
@objc func saleTickect() {
while(true) {
// 加互斥锁
/*
* 1)同OC中的@synchronized(self) {}
* 2)objc_sync_enter(self)和objc_sync_exit(self)必须成对使用,把要加锁的代码放在中间
*/
objc_sync_enter(self)
// 检查是否有余票,如果有则卖出去一张
let temp = totalTickets
for _ in 0 ..< 100000 {
// 空的for循环,模拟延迟
}
if(temp > 0) {
totalTickets = temp - 1
print("\(Thread.current.name)卖出去了一张票,还剩\(totalTickets)")
} else {
print("\(Thread.current.name)发现票已经卖完了")
break
}
objc_sync_exit(self)
}
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Swift 系统学习 33 Thread currentThread isMainThread 创建线程四种方式 模拟售票
猜你喜欢
转载自blog.csdn.net/clarence20170301/article/details/59110452
今日推荐
周排行