IOS 多线程原理
iPhone中的線程應(yīng)用并不是無(wú)節(jié)制的,官方給出的資料顯示iPhone OS下的主線程的堆棧大小是1M,第二個(gè)線程開始都是512KB。并且該值不能通過(guò)編譯器開關(guān)或線程API函數(shù)來(lái)更改。只有主線程有直接修改UI的能力。
一.線程概述
- 一個(gè)運(yùn)行著的程序就是一個(gè)進(jìn)程或者叫做一個(gè)任務(wù),一個(gè)進(jìn)程至少包含一個(gè)線程,線程就是程序的執(zhí)行流。
- Mac和iOS中的程序啟動(dòng),創(chuàng)建好一個(gè)進(jìn)程的同時(shí), 一個(gè)線程便開始運(yùn)行,這個(gè)線程叫主線程。
- 主線程在程序中的地位和其他線程不同,它是其他線程最終的父線程,且所有界面的顯示操作即AppKit或 UIKit的操作必須在主線程進(jìn)行。
- 系統(tǒng)中的每一個(gè)進(jìn)程都有自己獨(dú)立的虛擬內(nèi)存空間,而同一個(gè)進(jìn)程中的多個(gè)線程則共用進(jìn)程的內(nèi)存空間。
- 每創(chuàng)建一個(gè)新的線程,都需要一些內(nèi)存(如每個(gè)線程有自己的Stack空間)和消耗一定的CPU時(shí)間。
- 另外當(dāng)多個(gè)線程對(duì)同一個(gè)資源出現(xiàn)爭(zhēng)奪的時(shí)候需要注意線程安全問(wèn)題。
二.創(chuàng)建線程
創(chuàng)建一個(gè)新的線程就是給進(jìn)程增加了一個(gè)執(zhí)行流,執(zhí)行流總得有要執(zhí)行的代碼吧,所以新建一個(gè)線程需要提供一個(gè)函數(shù)或者方法作為線程的入口。1.使用NSThread
- NSThread提供了創(chuàng)建線程的途徑,還可以提供了檢測(cè)當(dāng)前線程是否是主線程的方法。 使用NSThread創(chuàng)建一個(gè)新的線程有兩種方式:
- 1.創(chuàng)建一個(gè)NSThread的對(duì)象,調(diào)用其start方法。對(duì)于這種方式的NSThread對(duì)象的創(chuàng)建,可以使用一個(gè)目標(biāo)對(duì)象的方法初始化一個(gè)NSThread對(duì)象,或者創(chuàng)建一個(gè)繼承NSThread類的子類,實(shí)現(xiàn)其main方法,然后在直接創(chuàng)建這個(gè)子類的對(duì)象。
- 2.使用 detachNewThreadSelector:toTarget:withObject:這個(gè)類方法創(chuàng)建一個(gè)線程,這個(gè)比較直接了,直接使用目標(biāo)對(duì)象的方法作為線程啟動(dòng)入口。
- NSThread提供了創(chuàng)建線程的途徑,還可以提供了檢測(cè)當(dāng)前線程是否是主線程的方法。 使用NSThread創(chuàng)建一個(gè)新的線程有兩種方式:
2.使用NSObject
- 其實(shí)NSObject直接就加入了多線程的支持,允許對(duì)象的某個(gè)方法在后臺(tái)運(yùn)行。如:
[myObj performSelectorInBackground:@selector(doSomething) withObject:nil];
- 其實(shí)NSObject直接就加入了多線程的支持,允許對(duì)象的某個(gè)方法在后臺(tái)運(yùn)行。如:
- 3.POSIX Thread
- 由于Mac和iOS都是基于Darwin系統(tǒng),Darwin系統(tǒng)的XUN內(nèi)核,是基于Mach和BSD的,繼承了BSD的POSIX接口,所以可以直接使用POSIX線程的相關(guān)接口來(lái)使用線程。
- 創(chuàng)建線程的接口為 pthread_create,當(dāng)然在創(chuàng)建之前可以通過(guò)相關(guān)函數(shù)設(shè)置好線程的屬性。以下為POSIX線程使用簡(jiǎn)單的例子。
三.多線程進(jìn)階
NSOperation&NSOperationQueue
很多時(shí)候我們使用多線程,需要控制線程的并發(fā)數(shù),畢竟線程也是消耗系統(tǒng)資源的,當(dāng)程序中同時(shí)運(yùn)行的線程過(guò)多時(shí),系統(tǒng)必然變慢。 所以很多時(shí)候我們會(huì)控制同時(shí)運(yùn)行線程的數(shù)目。
NSOperation可以封裝我們的操作,然后將創(chuàng)建好的NSOperation對(duì)象放到NSOperationQueue中,OperationQueue便開始啟動(dòng)新的線程去執(zhí)行隊(duì)列中的操作,OperationQueue的并發(fā)度是可以通過(guò)如下方式進(jìn)行設(shè)置:
- (void)setMaxConcurrentOperationCount:(NSInteger)count
總結(jié)
- 上一篇: 鲜为人知且未充分利用的 CSS 功能
- 下一篇: 软件开发—重构