你好,歡迎來到IOS教程網

 Ios教程網 >> IOS訊息 >> 關於IOS >> iOS之多線程3

iOS之多線程3

編輯:關於IOS

在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的時候,能夠更好的理解它們的內部實現基本原理.
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved