Swift 系统学习 33 Thread currentThread isMainThread 创建线程四种方式 模拟售票

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


}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值