多線程

參考文章:
iOS多線程--徹底學會多線程之『GCD』
Swift 3.0 GCD和DispatchQueue 使用解析

這哥們已經寫得很好了,代碼這東西溉苛,不敲一下,總覺得就不是自己的。再者想邦,swift GDC的接口真是改得那個揪心啊~两残!

并行隊列+同步執(zhí)行

不會創(chuàng)建新的線程永毅,而是在當前線程立即執(zhí)行

let queue = DispatchQueue.init(label: "com.bear.queue", attributes: .concurrent)

queue.sync {
    print("1-----\(Thread.current)")
}

queue.sync {
    print("2-----\(Thread.current)")
}

queue.sync {
    print("3-----\(Thread.current)")
}

queue.sync {
    print("4-----\(Thread.current)")
}

output:

1-----<NSThread: 0x100a062d0>{number = 1, name = main}
2-----<NSThread: 0x100a062d0>{number = 1, name = main}
3-----<NSThread: 0x100a062d0>{number = 1, name = main}
4-----<NSThread: 0x100a062d0>{number = 1, name = main}

并行隊列+異步執(zhí)行

會創(chuàng)建新的線程

let queue = DispatchQueue.init(label: "com.bear.queue", attributes: .concurrent)

let sem = DispatchSemaphore.init(value: 0)

queue.async {
    print("1-----\(Thread.current)")
}

queue.async {
    print("2-----\(Thread.current)")
}

queue.async {
    print("3-----\(Thread.current)")
}

queue.async {
    print("4-----\(Thread.current)")
}

output:

3-----<NSThread: 0x100a03570>{number = 3, name = (null)}
2-----<NSThread: 0x100a03650>{number = 4, name = (null)}
1-----<NSThread: 0x100b00160>{number = 2, name = (null)}
4-----<NSThread: 0x100c041d0>{number = 5, name = (null)}

串行隊列+異步執(zhí)行

let queue = DispatchQueue.init(label: "com.bear.queue")

let sem = DispatchSemaphore.init(value: 0)

queue.async {
    print("1-----\(Thread.current)")
}

queue.async {
    print("2-----\(Thread.current)")
}

queue.async {
    print("3-----\(Thread.current)")
}

queue.async {
    print("4-----\(Thread.current)")
}

output:

1-----<NSThread: 0x100c02ee0>{number = 2, name = (null)}
2-----<NSThread: 0x100c02ee0>{number = 2, name = (null)}
3-----<NSThread: 0x100c02ee0>{number = 2, name = (null)}
4-----<NSThread: 0x100c02ee0>{number = 2, name = (null)}

串行隊列+同步執(zhí)行

let queue = DispatchQueue.init(label: "com.bear.queue")

queue.sync {
    print("1-----\(Thread.current)")
}

queue.sync {
    print("2-----\(Thread.current)")
}

queue.sync {
    print("3-----\(Thread.current)")
}

queue.sync {
    print("4-----\(Thread.current)")
}

output:

1-----<NSThread: 0x100b06b50>{number = 1, name = main}
2-----<NSThread: 0x100b06b50>{number = 1, name = main}
3-----<NSThread: 0x100b06b50>{number = 1, name = main}
4-----<NSThread: 0x100b06b50>{number = 1, name = main}

主隊列+同步執(zhí)行(這個會死鎖)

主隊列+異步執(zhí)行

雖然是異步的,但由于分配到主隊列中人弓,所以不會創(chuàng)建新的線程沼死。

        DispatchQueue.main.async {
            print("1-----\(Thread.current)")
        }
        
        DispatchQueue.main.async {
            print("2-----\(Thread.current)")
        }
        
        DispatchQueue.main.async {
            print("3-----\(Thread.current)")
        }
        
        DispatchQueue.main.async {
            print("4-----\(Thread.current)")
        }

output:

1-----<NSThread: 0x60800006b4c0>{number = 1, name = main}
2-----<NSThread: 0x60800006b4c0>{number = 1, name = main}
3-----<NSThread: 0x60800006b4c0>{number = 1, name = main}
4-----<NSThread: 0x60800006b4c0>{number = 1, name = main}

異步一般情況下會創(chuàng)建新的線程來執(zhí)行任務。
同步隊列需要停止當前正在執(zhí)行的任務立即執(zhí)行任務
串行隊列就是一個接一個的執(zhí)行
并發(fā)隊列就是一起塞進隊列中崔赌,何時執(zhí)行意蛀,創(chuàng)建多少線程執(zhí)行收系統(tǒng)決定
主隊列中的異步任務不會創(chuàng)建新的線程(是不是可以說主隊列只一個主線程)


線程間通信

說得好高大上,其實就是GDC嵌套健芭。

        let queue = DispatchQueue.init(label: "com.bear.queue")
        queue.async {
            print("\(Thread.current)")
            DispatchQueue.main.async {
                print("\(Thread.current)")
            }
        }

任務分組

當多個任務進行并發(fā)異步執(zhí)行的時候县钥,任務的執(zhí)行順序是隨機的。此時可以通過barrier將任務進行分組慈迈。分組后組的執(zhí)行順序按代碼順序執(zhí)行若贮。而組內的順序依舊是隨機的。

        let queue = DispatchQueue.init(label: "com.bear.thread", attributes: .concurrent)
        queue.async {
            print("1----\(Thread.current)")
        }
        queue.async {
            print("2----\(Thread.current)")
        }
        queue.async {
            print("3----\(Thread.current)")
        }
        queue.async {
            print("1----\(Thread.current)")
        }
        queue.async {
            print("2----\(Thread.current)")
        }
        queue.async {
            print("3----\(Thread.current)")
        }
        
        queue.async(flags: .barrier) { 
            print("----barrier----")
        }
        
        queue.async {
            print("4----\(Thread.current)")
        }
        queue.async {
            print("5----\(Thread.current)")
        }
        queue.async {
            print("4----\(Thread.current)")
        }
        queue.async {
            print("5----\(Thread.current)")
        }

        queue.async(flags: .barrier) {
            print("----barrier----")
        }

        queue.async {
            print("6----\(Thread.current)")
        }
        queue.async {
            print("7----\(Thread.current)")
        }
        queue.async {
            print("6----\(Thread.current)")
        }
        queue.async {
            print("7----\(Thread.current)")
        }
        

output:

1----<NSThread: 0x60800026a480>{number = 3, name = (null)}
3----<NSThread: 0x600000264ac0>{number = 6, name = (null)}
2----<NSThread: 0x600000264a80>{number = 5, name = (null)}
1----<NSThread: 0x60800026a340>{number = 4, name = (null)}
2----<NSThread: 0x60800026a480>{number = 3, name = (null)}
3----<NSThread: 0x600000264ac0>{number = 6, name = (null)}
----barrier----
4----<NSThread: 0x600000264ac0>{number = 6, name = (null)}
5----<NSThread: 0x60800026a480>{number = 3, name = (null)}
4----<NSThread: 0x600000264ac0>{number = 6, name = (null)}
5----<NSThread: 0x60800026a340>{number = 4, name = (null)}
----barrier----
6----<NSThread: 0x60800026a340>{number = 4, name = (null)}
6----<NSThread: 0x60800026a340>{number = 4, name = (null)}
7----<NSThread: 0x60800026a340>{number = 4, name = (null)}
7----<NSThread: 0x600000264ac0>{number = 6, name = (null)}

延時任務

        let queue = DispatchQueue.init(label: "com.bear.thread", attributes: .concurrent)
        queue.asyncAfter(deadline: DispatchTime.now() + 3) {
            print("hello")
        }

Group(等待任務結束后執(zhí)行)

        let queue = DispatchQueue.init(label: "com.bear.thread", attributes: .concurrent)
        let group = DispatchGroup.init()
        let sem = DispatchSemaphore.init(value: 0)
        
        queue.async(group: group) { 
            sem.signal()
            print("group 1")
        }
        queue.async(group: group) {
            sem.signal()
            print("group 2")
        }
        queue.async(group: group) {
            sem.signal()
            print("group 3")
        }
        queue.async(group: group) {
            sem.signal()
            print("group 4")
        }
        
        
        group.notify(queue: queue) { 
            sem.wait()
            sem.wait()
            sem.wait()
            sem.wait()
            
            print("end")
        }

output:

group 1
group 4
group 3
group 2
end

DispatchWorkItem

類似dispatch_block_t

        let queue = DispatchQueue.init(label: "com.bear.thread", attributes: .concurrent)
        let dispatchWorkItem : DispatchWorkItem = DispatchWorkItem.init { 
            print("hello")
        }
        dispatchWorkItem.perform()
        dispatchWorkItem.notify(queue: queue) { 
            print("world")
        }

DispatchSource

這個和Timer有啥區(qū)別呢痒留?-谴麦。-

    func dispatchSource() {
        var count = 0
        let queue = DispatchQueue.init(label: "com.bear.thread", attributes: .concurrent)
        let timer = DispatchSource.makeTimerSource(queue: queue)
        timer.setEventHandler(handler: DispatchWorkItem{
            print("hello world")
            count += 1
            if count >= 5 {
                timer.cancel()
            }
        })
//        timer.scheduleOneshot(deadline: .now())
        timer.scheduleRepeating(deadline: .now() + 3, interval: .seconds(1))
        timer.resume()
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市伸头,隨后出現的幾起案子匾效,更是在濱河造成了極大的恐慌,老刑警劉巖恤磷,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弧轧,死亡現場離奇詭異,居然都是意外死亡碗殷,警方通過查閱死者的電腦和手機精绎,發(fā)現死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锌妻,“玉大人代乃,你說我怎么就攤上這事。” “怎么了搁吓?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵原茅,是天一觀的道長。 經常有香客問我堕仔,道長擂橘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任摩骨,我火速辦了婚禮通贞,結果婚禮上,老公的妹妹穿的比我還像新娘恼五。我一直安慰自己昌罩,他們只是感情好,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布灾馒。 她就那樣靜靜地躺著茎用,像睡著了一般。 火紅的嫁衣襯著肌膚如雪睬罗。 梳的紋絲不亂的頭發(fā)上轨功,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音容达,去河邊找鬼夯辖。 笑死,一個胖子當著我的面吹牛董饰,可吹牛的內容都是我干的。 我是一名探鬼主播圆米,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼卒暂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了娄帖?” 一聲冷哼從身側響起也祠,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎近速,沒想到半個月后诈嘿,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡削葱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年奖亚,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片析砸。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡昔字,死狀恐怖,靈堂內的尸體忽然破棺而出首繁,到底是詐尸還是另有隱情作郭,我是刑警寧澤陨囊,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站夹攒,受9級特大地震影響蜘醋,放射性物質發(fā)生泄漏。R本人自食惡果不足惜咏尝,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一压语、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧状土,春花似錦无蜂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至累驮,卻和暖如春酣倾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谤专。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工躁锡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人置侍。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓映之,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蜡坊。 傳聞我的和親對象是個殘疾皇子杠输,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內容