在OC中,雖然使用NSThread的實際場景不多,但如果能夠在學習多線程的時候,仔細的了解NSThread的方法,可以對後面深入學習GCD與NSOperation會大有幫助.今天討論一下關於線程的狀態一些情況:
一個線程在內存中的狀態,NSThread提供了大體三種處理方式:取消(cancel),休眠(sleep),以及退出(exit) 下面簡單梳理一下這幾種情況: 1. - (void)cancel // 取消 這個方法會將正在執行的當前進程信息保存給接收者,然後再將進程取消,同時會通過方法isCancled反饋狀態,如果成功取消,isCancled將會返回YES,否則返回NO; 進程被取消後,會調用exit方法; 2.+ (void)sleepUntilDate:(NSDate *)aDate // 休眠進程 這個方式NSThread的靜態方法;它根據給定的時間(aDate)阻塞當前進程的執行,它實現的底層原理是阻塞了進程的runloop的運行,這樣當前進程就無法獲得執行的機會; 與此類似的,還有一個靜態方法:+ (void)sleepForTimeInterval:(NSTimeInterval)ti,它們的使用原理是一樣的. 3.+ (void)exit // 退出進程 這個方法會調用NSThread的類方法 currentThread來訪問當前進程,這樣做的一個目的是為了讓當前進程可以發送一個通知 (NSThreadWillExitNotification)給通知中心. 這個方法可以手動調用,也可以等進程正常執行結束會自動調用. 在手動調用這個進程時,一定要提前釋放之前申請的資源;否則容易產生內存洩漏; 同時NSThread也提供了三個查詢進程執行狀態的方法: 1.- (BOOL)isExecuting 如果進程正在執行,這個方法返回YES,否則返回NO; 2.- (BOOL)isFinished 如果進程執行結束,返回YES,否則返回NO; 3.- (BOOL)isCancelled 如果進程被取消,返回YES,否則返回NO; 在OC中,NSThread的狀態變化,都會在內部使用消息通知機制來告知系統,並且NSThread只會發送三種消息到系統的通知中心: 1.NSDidBecomeSingleThreadedNotification 這個通知目前沒有實際意義,蘋果也僅僅是保留這個擴展通知而已,並沒有在NSThread的方法中,來觸發這個消息,不過根據這個通知的字面意思來理解,是進程又回到單一線程的 時候,會發送這個通知;但在多線程環境下, 這個沒有什麼實際的處理工作,可暫時忽略; 2.NSThreadWillExitNotification 這個通知被發送到通知中心的時候,並沒有包含userinfo的字典信息(使用通知中心的伙伴們都應該知道userinfo滴,偶就不解釋啦),並且這個通知是在進程執行exit方法的時候觸發 的.你可以通過監聽這個通知來處理一下進程即將結束之前的一些事情(就像遺言一樣). 3.NSWillBecomeMultiThreadedNotification 這個通知只會被NSThread觸發一次,條件是當第一個進程在調用了start或者detachNewThreadSelector:toTarget:withObject:方法.這個通知的接收者的一些處理方法都是在主 線程上進行的;這是因為這個通知是在系統生產新的子線程之前進行的,所以在監聽這個通知的時候,調用監聽者的通知方法都會在主線程進行. 其實NSThread提供的這些基本方法和狀態通知,我們可以大體的了解進程一個生命周期,並且在這個生命周期中,進程經過了什麼狀態的轉變,以及進程間簡單的交互(使用通知中心),這對我們以後在使用GCD以及NSOperate的時候,能夠更好的理解它們的內部實現基本原理.