使用這個方式比較輕量級劝贸,但是優(yōu)缺點很明顯。有兩種方式:
- 使用detachNewThreadSelector:toTarget:withObject:這個類方法來生成線程贰逾。
- 創(chuàng)建一個NSThread的對象悬荣,并且給對象發(fā)送start消息。
使用上面兩種方式都會創(chuàng)建一個detached線程疙剑。一個detached線程意味著這個線程的資源會在線程exit的時候自動回收。
[NSThread detachNewThreadSelector:@selector(saleTicket) toTarget:self withObject:nil];
NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(saleTicket) object:nil]; [thread start];
很簡單践叠。言缤。。禁灼。管挟。。弄捕。
看看這個方法:
(void)saleTicket{
if (tickts>0) {
//這個區(qū)域其實是臨界區(qū),在多線程狀態(tài)下僻孝,多個線程可能同時執(zhí)行到這個位置导帝。票數(shù)可能被減到-1。 tickts--;
}else{
NSLog(@"票已經(jīng)售磬了!");
}
}
這其實是比較簡單的一個線程同步問題穿铆,資源競爭您单。我們解決這個辦法的問題。使用的是這樣一個過程荞雏。
(void)saleTicket{
//此時資源同一時刻只能被一個線程訪問
[theLock lock];
if (tickts>0) {
tickts--;
}else{
NSLog(@"票已經(jīng)售磬了!");
}
[theLock unlock];
}
這玩意叫互斥鎖虐秦。
還有個形式是這樣子的。叫條件凤优,涉及到一個經(jīng)典問題叫生產(chǎn)者和消費者悦陋。如果兩個線程一個在生產(chǎn),一個在消費筑辨。那么沒生產(chǎn)出來的時候應該怎么整俺驶。可能會說我這么搞棍辕,生產(chǎn)完了暮现,再消費。騷年痢毒,那就拋棄了并發(fā)編程的熱血啊送矩。
什么是NSCondition
NSCondition 的對象實際上作為一個鎖和一個線程檢查器:鎖主要為了當檢測條件時保護數(shù)據(jù)源,執(zhí)行條件引發(fā)的任務(wù)哪替;線程檢查器主要是根據(jù)條件決定是否繼續(xù)運行線程栋荸,即線程是否被阻塞。
舉例說明:
NSMutableArray *imageArray; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{ //見圖片存儲到硬緩存中 [condition lock]; if ([imageArray count]==0) { //線程等待過程會釋放資源鎖凭舶,也就是說晌块,別的線程會獲取這個鎖對象,并執(zhí)行相應代碼 [condition wait]; } UIImage *img = [imageArray objectAtIndex:0]; /** 存儲這個img*/ [imageArray removeObjectAtIndex:0]; [condition unlock]; }); dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{ //圖片下載 [condition lock]; UIImage *img = downloadImage(); [imageArray addObject:img]; [condition signal]; /** 存儲這個img*/ [condition unlock]; });
通過上面的過程可以看出帅霜,雖然thread輕量級一些匆背,但是需要自己管理線程的生命周期,線程同步身冀。線程同步對數(shù)據(jù)的加鎖會有一定的系統(tǒng)開銷钝尸。thread是可以cancle的,但是注意其中的過程搂根。同時也有監(jiān)聽線程狀態(tài)的函數(shù)珍促。當前線程可以sleep,但是注意sleep不會釋放mutex剩愧。會導致其他線程等待猪叙。