iOS多線程 串行隊列、併發隊列以及同步執行、異步執行

首發我的博客: www.ljcoder.com/15615179983…html

關鍵詞的理解

1. 進程

正在運行的程序被稱爲進程,負責程序運行的內存分配,每個進程都有獨立的虛擬內存空間swift

2. 線程

線程是進程中最小的執行單元,一個進程能夠有多條線程,可是至少包含一條線程,被稱爲主線程。線程裏有很是多的任務。多線程

  1. 同一時間單核CPU只能執行一個線程,多線程是CPU快速在多個線程之間切換,形成多個線程同時執行的假象
  2. 多核CPU是真的同時處理多個線程
3. 並行

充分利用計算機的多核,在多個線程上同步進行併發

4. 併發

在一條線程上經過快速切換,讓人感受在同步進行異步

5. 任務

任務分爲同步任務和異步任務,任務是在線程中執行的async

  1. 同步任務:同步任務不會開啓新的線程,按順序執行,執行完一個再執行下一個,須要等待。ui

    開啓同步任務使用GCD中的syncspa

  2. 異步任務:異步任務是彼此獨立的,不須要等待某一件事完成後再工做,沒法肯定任務的執行順序。執行異步任務會建立新的線程。異步是最終目的,多線程只是咱們實現異步的一種手段。線程

開啓異步任務使用GCD中的async3d

6. 隊列

是先進先出的線性表。

  1. 串行隊列:隊列中的任務一個一個的執行,前一個任務不執行完畢,隊列不會調度。
  2. 並行隊列:只要有空閒的線程,隊列就會調度當前任務,交給線程去執行,不用等待上一個任務執行完畢。
  3. 全局隊列:系統開發的,是並行隊列,但調用時無法確認操做所在隊列
  4. 主隊列:每個應用程序對應惟一一個主隊列,UI操做必須在主線程內,不然可能出現崩潰

隊列與任務的組合

1. 串行隊列同步執行

不會建立新線程,任務一個一個按順序執行。

let serialQueue = DispatchQueue.init(label: "test") // 串行隊列
for i in 0..<10 {
    serialQueue.sync {
        Thread.sleep(forTimeInterval: 1)
        print("\(Date()) i \(i), current theard: \(Thread.current)")
    }
}
複製代碼

*w779

2. 並行隊列同步執行

不用等待一個任務執行完畢纔開始調度下一個任務,可是同步任務不會開啓新的線程,因此也是一個一個的執行。

let concurrentQueue = DispatchQueue.init(label: "test", attributes: .concurrent) // 並行隊列
for i in 0..<10 {
    concurrentQueue.sync {
        Thread.sleep(forTimeInterval: 1)
        print("\(Date()) i \(i), current theard: \(Thread.current)")
    }
}
複製代碼

*w780

3. 串行隊列異步執行

按順序來調度任務,任務會建立一個新的線程(線程5)來執行

for i in 0..<10 {
    serialQueue.async {
        Thread.sleep(forTimeInterval: 1)
        print("\(Date()) 執行任務\(i), current theard: \(Thread.current)")
    }
}
複製代碼

*w786

4. 並行隊列異步執行

會建立多個線程,操做併發無序執行。

for i in 0..<10 {  
    concurrentQueue.async {
        Thread.sleep(forTimeInterval: 1)
        print("\(Date()) 執行任務\(i), current theard: \(Thread.current)")
    }
}
複製代碼

*w800

5. 全局隊列同步執行

操做不會新建線程,操做順序執行

for i in 0..<10 {
    DispatchQueue.global().sync {
        Thread.sleep(forTimeInterval: 1)
        print("\(Date()) 執行任務\(i), current theard: \(Thread.current)")
    }
}
複製代碼

*w777

6. 全局隊列異步執行

會建立多個線程,操做無序執行

for i in 0..<10 { 
    DispatchQueue.global().async {
        Thread.sleep(forTimeInterval: 1)
        print("\(Date()) 執行任務\(i), current theard: \(Thread.current)")
    }
}
複製代碼

*w795

7. 主線程同步執行

主線程不會結束,主隊列中的同步操做永遠不會被執行,會死鎖。

print("1")

DispatchQueue.main.sync {
    print("2")
}

print("3")
複製代碼

相關文章
相關標籤/搜索