今天朋友問(wèn)了一個(gè)問(wèn)題,就是標(biāo)題,但是我特么百度一搜 Java 啥的一大堆 ,據(jù)說(shuō)是面試題目, 我這里也就寫(xiě)了一個(gè)
金典題目:
有A,B,C三個(gè)線程, A線程輸出A, B線程輸出B, C線程輸出C,要求, 同時(shí)啟動(dòng)三個(gè)線程
按順序輸出ABC, 無(wú)限循環(huán)
//這里采用信號(hào)量解決,GCD中 有3個(gè)函數(shù)是針對(duì)信號(hào)量(semaphore)的操作的
dispatch_semaphore_create 創(chuàng)建一個(gè)semaphore
dispatch_semaphore_signal 發(fā)送一個(gè)信號(hào)
dispatch_semaphore_wait 等待信號(hào)
簡(jiǎn)單的說(shuō)一下作用,套的百度到的話語(yǔ),感覺(jué)不錯(cuò)
簡(jiǎn)單的介紹一下這三個(gè)函數(shù),第一個(gè)函數(shù)有一個(gè)整形的參數(shù),我們
可以理解為信號(hào)的總量,
dispatch_semaphore_signal 是發(fā)送一個(gè)信號(hào),自然會(huì)讓信號(hào)總量加1
dispatch_semaphore_wait 等待信號(hào),當(dāng)信號(hào)總量少于0的時(shí)候就會(huì)一直等待,否則就可以正常的
執(zhí)行,并讓信號(hào)總量-1,根據(jù)這樣的原理,我們便可以快速的創(chuàng)建
一個(gè)并發(fā)控制來(lái)同步任務(wù)和有限資源訪問(wèn)控制
好了 廢話不多說(shuō)直接上代碼
import Foundation
// 使用信號(hào)量
// 初始 A線程的信號(hào)量為 1 ,為了 A 線程不用等待直接執(zhí)行
var ASemaphore = dispatch_semaphore_create(1)
var BSemaphore = dispatch_semaphore_create(0)
var CSemaphore = dispatch_semaphore_create(0)
var queue = dispatch_queue_create("com.maozhua", DISPATCH_QUEUE_CONCURRENT)
dispatch_async(queue) { () -> Void in
while true{
dispatch_semaphore_wait(ASemaphore, DISPATCH_TIME_FOREVER);
print("A")
dispatch_semaphore_signal(BSemaphore)
}
}
dispatch_async(queue) { () -> Void in
while true{
dispatch_semaphore_wait(BSemaphore, DISPATCH_TIME_FOREVER);
print("B")
dispatch_semaphore_signal(CSemaphore)
}
}
dispatch_async(queue) { () -> Void in
while true{
dispatch_semaphore_wait(CSemaphore, DISPATCH_TIME_FOREVER);
print("C")
dispatch_semaphore_signal(ASemaphore)
}
}
//因?yàn)槭菍?xiě)的命令行代碼 所以 開(kāi)啟runloop 保證線程不死
NSRunLoop.mainRunLoop().run()
OK 結(jié)果,代碼可以直接復(fù)制 運(yùn)行 自己試試