美文网首页
Swift - 多线程实现方式(1) - Thread

Swift - 多线程实现方式(1) - Thread

作者: 小驴拉磨 | 来源:发表于2020-07-15 17:40 被阅读0次
    1、Swift继续使用Object-C原有的一套线程,包括三种多线程编程技术:

    (1)Thread
    (2)Cocoa Operation(Operation和OperationQueue)
    (3)Grand Central Dispath(GCD)

    2、本文着重介绍Thread

    Tread在三种多线程技术中是最轻量级的,但需要自己管理线程的生命周期和线程同步。线程同步对数据的加锁会有一定的系统开销。

    3、Thread的两种创建方式

    (1)直接创建线程并且自动运行线程
    (2)先创建一个线程对象,然后手动运行线程,在运行线程操作之前可以设置线程的优先级等线程信息。

    import UIKit
    
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // 使用类方法
            Thread.detachNewThreadSelector(#selector(downloadImage), toTarget: self, with: nil)
            //方式2:实例方法-便利构造器
            let myThread = Thread(target: self, selector: #selector(downloadImage), object: nil)
            myThread.start()
        }
    
        @objc func downloadImage()
        {
            let imageUrl = "http://hangge.com/blog/images/logo.png"
            let data = try! Data(contentsOf: URL(string: imageUrl)!)
            print(data.count)
        }
    
    }
    
    4、线程同步

    线程同步方法通过锁来实现,每个线程都只用一个锁,这个锁与一个特定的线程关联。下面演示两个线程之间的同步。

    import UIKit
    
    class ViewController: UIViewController {
    
        //定义两个线程
        var thread1:Thread?
        var thread2:Thread?
         
        //定义两个线程条件,用于锁住线程
        let condition1 = NSCondition()
        let condition2 = NSCondition()
        
        override func viewDidLoad() {
            super.viewDidLoad()
             
            thread2 = Thread(target: self, selector: #selector(ViewController.method2),
                             object: nil)
            thread1 = Thread(target: self, selector: #selector(ViewController.method1),
                             object: nil)
            thread1?.start()
        }
         
        //定义两方法,用于两个线程调用
        @objc func method1(sender:AnyObject){
            for i in 0 ..< 10 {
                print("Thread 1 running \(i)")
                sleep(1)
                 
                if i == 2 {
                    thread2?.start() //启动线程2
                     
                    //本线程(thread1)锁定
                    condition1.lock()
                    condition1.wait()
                    condition1.unlock()
                }
            }
             
            print("Thread 1 over")
             
            //线程2激活
            condition2.signal()
        }
         
        //方法2
        @objc func method2(sender:AnyObject){
            for i in 0 ..< 10 {
                print("Thread 2 running \(i)")
                sleep(1)
                 
                if i == 2 {
                    //线程1激活
                    condition1.signal()
                     
                    //本线程(thread2)锁定
                    condition2.lock()
                    condition2.wait()
                    condition2.unlock()
                }
            }
             
            print("Thread 2 over")
        }
    
    }
    
    image.png

    原文出自:www.hangge.com 转载请保留原文链接:https://www.hangge.com/blog/cache/detail_743.html

    相关文章

      网友评论

          本文标题:Swift - 多线程实现方式(1) - Thread

          本文链接:https://www.haomeiwen.com/subject/meydhktx.html