蘋(píng)果官方文檔Thread-Foundation
一個(gè)NSThread對(duì)象可以操縱一條線程. 你可以使用這個(gè)類(lèi)來(lái)讓你的OC方法運(yùn)行在自己的線程中. 當(dāng)你想要執(zhí)行一個(gè)漫長(zhǎng)的任務(wù)但不希望阻塞運(yùn)行在主線程的其他應(yīng)用時(shí), 使用線程就特別有效. 特別地, 你可以使用線程去避免阻塞應(yīng)用的主線程同時(shí)能夠處理用戶(hù)接口和動(dòng)作有關(guān)的事件. 線程也可以用來(lái)將一個(gè)龐大的任務(wù)劃分成幾個(gè)小任務(wù), 這能提升多核計(jì)算機(jī)的性能.
在OS X v10.5以前, 你只能通過(guò)detachNewThreadSelector:toTarget:withObject:方法去開(kāi)啟一條新的線程. 在OS X v10.5及之后, 你可以創(chuàng)建一個(gè)NSThread對(duì)象并且使用start方法來(lái)啟動(dòng)它.
在OS X v10.5, NSThread和NSOperation一樣可以監(jiān)控線程的運(yùn)行時(shí)狀態(tài). 你可以使用同樣的邏輯去取消線程的執(zhí)行或者判斷線程是否仍正在執(zhí)行或已經(jīng)完成了任務(wù). 取消一條線程需要線程代碼的支持, 可以在cancel方法的描述中得到更詳細(xì)的信息.
Subclassing Notes
在OS X v10.5及之后, 你可以繼承NSThread并且重寫(xiě)main方法去實(shí)現(xiàn)你的線程的主入口. 只要你重寫(xiě)了main方法, 你可以直接調(diào)用[super main]而沒(méi)必要重新調(diào)用它的繼承行為.
Initializing an NSThread Object
- init
返回一個(gè)經(jīng)初始化的NSThread對(duì)象
init() // swift
-(instancetype)init // objc
- initWithTarget:selector:object:
返回一個(gè)給定參數(shù)的經(jīng)初始化的對(duì)象
參數(shù) :
- target : 方法接收者
- selector : 發(fā)送給target的方法的選擇器. 這個(gè)選擇器必須只接收一個(gè)參數(shù)和沒(méi)有返回值
- argument : 傳遞給target的單一參數(shù). 可以為nil.
說(shuō)明 :
target和argument對(duì)象在分離的線程的執(zhí)行期間將會(huì)被retain. 當(dāng)線程退出的時(shí)候就會(huì)release.
Starting a Thread
- detachNewThreadSelector:toTarget:withObject:
使用特定選擇器作為線程入口點(diǎn)來(lái)分離一個(gè)新的線程
參數(shù) :
- aSelector : 發(fā)送給target的方法的選擇器. 這個(gè)選擇器必須只接收一個(gè)參數(shù)和沒(méi)有返回值
- aTarget : 將會(huì)在新線程中收到aSelector消息的對(duì)象
- anArgument : 傳遞給target的單一參數(shù), 可以為nil
說(shuō)明 :
target和argument對(duì)象在分離的線程的執(zhí)行期間將會(huì)被retain. 當(dāng)線程退出的時(shí)候就會(huì)release. 當(dāng)target執(zhí)行完aSelector發(fā)送的消息時(shí), 線程便會(huì)退出.
如果這個(gè)線程是應(yīng)用分離的第一個(gè)線程, 這個(gè)方法將會(huì)post一條NSWillBecomeMultiThreadedNotification消息給默認(rèn)通知中心.
- start
說(shuō)明 :
在新線程中調(diào)用對(duì)象的main方法. 如果對(duì)象已經(jīng)初始化了target和selector, 則默認(rèn)的main方法會(huì)自動(dòng)調(diào)用selector.
如果這個(gè)線程是應(yīng)用分離的第一個(gè)線程, 這個(gè)方法將會(huì)post一條NSWillBecomeMultiThreadedNotification消息給默認(rèn)通知中心.
Stopping a Thread
- sleepUntilDate : 在特定的事件阻塞當(dāng)前線程
- sleepForTimeInterval :
以上兩個(gè)方法, 當(dāng)線程被阻塞時(shí)不存在運(yùn)行循環(huán)處理
- exit
結(jié)束當(dāng)前線程
說(shuō)明 :
這個(gè)方法使用currentThread這個(gè)類(lèi)方法來(lái)訪問(wèn)當(dāng)前線程. 在退出線程以前, 該方法會(huì)發(fā)送一個(gè) NSThreadWillExitNotification 消息, 帶上這個(gè)線程對(duì)象 給通知中心. 因?yàn)橄⒌膫魉褪峭竭M(jìn)行的, 所以所以監(jiān)聽(tīng)者都能在線程結(jié)束前監(jiān)聽(tīng)到這個(gè)信息.
應(yīng)該避免調(diào)用這個(gè)方法, 因?yàn)樗⒉唤o機(jī)會(huì)你的線程去清理在線程運(yùn)行期間分配的資源.
- cancel
改變線程的cancelled屬性的狀態(tài), 并且表示這個(gè)線程應(yīng)該要退出了
說(shuō)明 :
這個(gè)方法的語(yǔ)義跟NSOperation中使用的一樣. 這個(gè)方法設(shè)置線程對(duì)象的狀態(tài)信息并且映射到isCancelled方法上. 線程會(huì)定期地調(diào)用isCancelled方法來(lái)確認(rèn)自己是不是應(yīng)該要取消了, 如果是, 則準(zhǔn)備退出線程.
Determining the Thread's Execution State
executing Property
布爾值, 表示線程是否正在執(zhí)行中(只讀屬性)
finished Property
布爾值, 表示線程是否已經(jīng)完成執(zhí)行(只讀屬性)
cancelled Property
布爾值, 表示線程是否以已經(jīng)被取消(只讀屬性)
Working with the Main Thread
- isMainThread 和 isMainThread Property
isMainThread : 返回一個(gè)布爾值表示當(dāng)前線程是否是主線程
isMainThread Property : 布爾值, 表示當(dāng)前線程是否是主線程(只讀屬性)
- mainThread
返回一個(gè)主線程對(duì)象(NSThread)
Querying the Environment
- isMultiThreaded
返回一個(gè)布爾值表示應(yīng)用是否處于多線程狀態(tài)
說(shuō)明 :
一個(gè)應(yīng)用中如果一個(gè)分離的線程在主線程中調(diào)用了detachNewThreadSelector:toTarget:withObject: 或者 start 方法就被認(rèn)為是處于多線程狀態(tài). 但是如果你使用non-Cocoa API, 比如 POSIX 或者 Multiprocessing Services APIs 去分離一個(gè)線程, 這個(gè)方法的返回結(jié)果依舊為NO. 應(yīng)用處于多線程狀態(tài)并不代表新線程正處于運(yùn)行狀態(tài), 僅僅代表有新的線程被創(chuàng)建了而已.
- currentThread
返回當(dāng)前線程對(duì)象
- callStackReturnAddresses
返回裝著調(diào)用棧返回地址的數(shù)組, 里面每一個(gè)元素都是包含著NSUInteger值的NSNumber對(duì)象
- callStackSymbols
返回裝著調(diào)用棧標(biāo)志的數(shù)組, 每一個(gè)元素都是NSString對(duì)象
說(shuō)明 :
返回值描述的是方法當(dāng)前線程的調(diào)用椝耪溃回溯
Working with Thread Properties
threadDictionary
name
stackSize
Working with Thread Priorities
- threadPriority
threadPriority
setThreadPriority
Notifications
NSDidBecomeSingleThreadedNotification
NSThreadWillExitNotification
NSWillBecomeMultiThreadedNotification