2019-11-15 iOS swift中GCD多線程的理解與鞏固

優(yōu)點(diǎn):

(1)易用:GCD比thread更簡單易用?;赽lock的特效使它能極為簡單地在不同代碼作用域之間傳遞上下文。
(2)效率:GCD實(shí)現(xiàn)功能輕量,優(yōu)雅,使得它在很多地方比專門創(chuàng)建消耗資源的線程更加實(shí)用且快捷。
(3)性能:GCD自動(dòng)根據(jù)系統(tǒng)負(fù)載來增減線程數(shù)量,從而減少了上下文切換并增加了計(jì)算效率。
(4)安全:無需加鎖或其他同步機(jī)制

多線程的四種方式

1,串行 同步

func test1() {
        let test1queue = DispatchQueue.init(label: "test1que")
        test1queue.sync {
            for i in 0..<2 {
                print("\(i),\(Thread.current)")
                
            }
            print("第一個(gè)結(jié)束\n-------------------------")
        }
        test1queue.sync {
            for i in 2..<4 {
                print("\(i),\(Thread.current)")
                
            }
            print("第二個(gè)結(jié)束\n-------------------------")
        }
        test1queue.sync {
            for i in 4..<6 {
                print("\(i),\(Thread.current)")
                
            }
            print("第三個(gè)結(jié)束\n-------------------------")
        }
        
    }
打印結(jié)果:
0,<NSThread: 0x280942040>{number = 1, name = main}
1,<NSThread: 0x280942040>{number = 1, name = main}
第一個(gè)結(jié)束
-------------------------
2,<NSThread: 0x280942040>{number = 1, name = main}
3,<NSThread: 0x280942040>{number = 1, name = main}
第二個(gè)結(jié)束
-------------------------
4,<NSThread: 0x280942040>{number = 1, name = main}
5,<NSThread: 0x280942040>{number = 1, name = main}
第三個(gè)結(jié)束
-------------------------

串行同步: 順序執(zhí)行 不開啟新線程

2,串行 異步

func test2() {
        let test1queue = DispatchQueue.init(label: "test1que")
        test1queue.async {
            for i in 0..<2 {
                print("\(i),\(Thread.current)")
                
            }
            print("第一個(gè)結(jié)束\n-------------------------")
        }
        test1queue.async {
            for i in 2..<4 {
                print("\(i),\(Thread.current)")
                
            }
            print("第二個(gè)結(jié)束\n-------------------------")
        }
        test1queue.async {
            for i in 4..<6 {
                print("\(i),\(Thread.current)")
                
            }
            print("第三個(gè)結(jié)束\n-------------------------")
        }
        
    }
打印結(jié)果:
0,<NSThread: 0x283954bc0>{number = 6, name = (null)}
1,<NSThread: 0x283954bc0>{number = 6, name = (null)}
第一個(gè)結(jié)束
-------------------------
2,<NSThread: 0x283954bc0>{number = 6, name = (null)}
3,<NSThread: 0x283954bc0>{number = 6, name = (null)}
第二個(gè)結(jié)束
-------------------------
4,<NSThread: 0x283954bc0>{number = 6, name = (null)}
5,<NSThread: 0x283954bc0>{number = 6, name = (null)}
第三個(gè)結(jié)束
-------------------------

串行異步: 順序執(zhí)行 開啟新線程(只開啟一條線程)

3,并發(fā) 同步

func test3() {
        let test1queue = DispatchQueue(label: "test1que",  attributes: .concurrent)
        test1queue.sync {
            for i in 0..<2 {
                print("\(i),\(Thread.current)")
                
            }
            print("第一個(gè)結(jié)束\n-------------------------")
        }
        test1queue.sync {
            for i in 2..<4 {
                print("\(i),\(Thread.current)")
                
            }
            print("第二個(gè)結(jié)束\n-------------------------")
        }
        test1queue.sync {
            for i in 4..<6 {
                print("\(i),\(Thread.current)")
                
            }
            print("第三個(gè)結(jié)束\n-------------------------")
        }
    }
打印結(jié)果: 
0,<NSThread: 0x2817aadc0>{number = 1, name = main}
1,<NSThread: 0x2817aadc0>{number = 1, name = main}
第一個(gè)結(jié)束
-------------------------
2,<NSThread: 0x2817aadc0>{number = 1, name = main}
3,<NSThread: 0x2817aadc0>{number = 1, name = main}
第二個(gè)結(jié)束
-------------------------
4,<NSThread: 0x2817aadc0>{number = 1, name = main}
5,<NSThread: 0x2817aadc0>{number = 1, name = main}
第三個(gè)結(jié)束
-------------------------

并發(fā)同步: 順序執(zhí)行 不開新線程

4,并發(fā) 異步(也是用的最多的一種)

func test4() {
        let test1queue = DispatchQueue(label: "test1que",  attributes: .concurrent)
        for i in 0...50 {
            test1queue.async {
                print("\(i),\(Thread.current)----------------")
            }
        }
    }
打印結(jié)果:(最后10個(gè))
40,<NSThread: 0x281b2f1c0>{number = 4, name = (null)}----------------
41,<NSThread: 0x281b2f1c0>{number = 4, name = (null)}----------------
42,<NSThread: 0x281b2f1c0>{number = 4, name = (null)}----------------
43,<NSThread: 0x281b2f1c0>{number = 4, name = (null)}----------------
44,<NSThread: 0x281b2f1c0>{number = 4, name = (null)}----------------
45,<NSThread: 0x281b2f1c0>{number = 4, name = (null)}----------------
46,<NSThread: 0x281b2f1c0>{number = 4, name = (null)}----------------
47,<NSThread: 0x281b2f1c0>{number = 4, name = (null)}----------------
48,<NSThread: 0x281b2f1c0>{number = 4, name = (null)}----------------
8,<NSThread: 0x281b32780>{number = 6, name = (null)}----------------
16,<NSThread: 0x281b1c140>{number = 7, name = (null)}----------------
17,<NSThread: 0x281b1c200>{number = 8, name = (null)}----------------
32,<NSThread: 0x281b18000>{number = 9, name = (null)}----------------
33,<NSThread: 0x281b180c0>{number = 10, name = (null)}----------------
49,<NSThread: 0x281b18900>{number = 11, name = (null)}----------------
50,<NSThread: 0x281b1ccc0>{number = 12, name = (null)}----------------

并發(fā)異步: 無序執(zhí)行 開啟n條線程

隊(duì)列獲取方式

//創(chuàng)建串行隊(duì)列
let serial = DispatchQueue(label: "serialQueue")

//創(chuàng)建并行隊(duì)列
let concurrent = DispatchQueue(label: "concurrentQueue", attributes: .concurrent)

//獲取全局隊(duì)列
let globalQueue = DispatchQueue.global(qos: .default)

//獲取主線程隊(duì)列
let mainQueue = DispatchQueue.main//一般跟UI相關(guān)的操作都放在主線程隊(duì)列
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容