優(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ì)列