首發我的博客: www.ljcoder.com/15615179983…html
正在運行的程序被稱爲進程,負責程序運行的內存分配,每個進程都有獨立的虛擬內存空間swift
線程是進程中最小的執行單元,一個進程能夠有多條線程,可是至少包含一條線程,被稱爲主線程。線程裏有很是多的任務。多線程
- 同一時間單核CPU只能執行一個線程,多線程是CPU快速在多個線程之間切換,形成多個線程同時執行的假象
- 多核CPU是真的同時處理多個線程
充分利用計算機的多核,在多個線程上同步進行併發
在一條線程上經過快速切換,讓人感受在同步進行異步
任務分爲同步任務和異步任務,任務是在線程中執行的async
同步任務:同步任務不會開啓新的線程,按順序執行,執行完一個再執行下一個,須要等待。ui
開啓同步任務使用GCD中的
sync
。spa
異步任務:異步任務是彼此獨立的,不須要等待某一件事完成後再工做,沒法肯定任務的執行順序。執行異步任務會建立新的線程。異步是最終目的,多線程只是咱們實現異步的一種手段。線程
開啓異步任務使用GCD中的
async
。3d
是先進先出的線性表。
不會建立新線程,任務一個一個按順序執行。
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)")
}
}
複製代碼
不用等待一個任務執行完畢纔開始調度下一個任務,可是同步任務不會開啓新的線程,因此也是一個一個的執行。
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)")
}
}
複製代碼
按順序來調度任務,任務會建立一個新的線程(線程5)來執行
for i in 0..<10 {
serialQueue.async {
Thread.sleep(forTimeInterval: 1)
print("\(Date()) 執行任務\(i), current theard: \(Thread.current)")
}
}
複製代碼
會建立多個線程,操做併發無序執行。
for i in 0..<10 {
concurrentQueue.async {
Thread.sleep(forTimeInterval: 1)
print("\(Date()) 執行任務\(i), current theard: \(Thread.current)")
}
}
複製代碼
操做不會新建線程,操做順序執行
for i in 0..<10 {
DispatchQueue.global().sync {
Thread.sleep(forTimeInterval: 1)
print("\(Date()) 執行任務\(i), current theard: \(Thread.current)")
}
}
複製代碼
會建立多個線程,操做無序執行
for i in 0..<10 {
DispatchQueue.global().async {
Thread.sleep(forTimeInterval: 1)
print("\(Date()) 執行任務\(i), current theard: \(Thread.current)")
}
}
複製代碼
主線程不會結束,主隊列中的同步操做永遠不會被執行,會死鎖。
print("1")
DispatchQueue.main.sync {
print("2")
}
print("3")
複製代碼