線程和進程
一般而言進程包含如下3個特徵:
- 獨立性:進程是系統中獨立存在的實體,擁有自己獨立的資源,擁有自己私有的地址空間。在沒有進過進程本身允許的情況下,一個用戶進程不可以直接訪問其他進程的地址空間。
- 動態性:程序只是一個靜態的指令集合,而進程是一個正在系統中活動的指令集合。
- 併發性:多個進程可以在單個處理器上併發執行,多個進程間不會互相影響。
併發性和並行性是兩個概念,並行指在同一時刻有多條指令在多個處理器上同時執行;
併發指在同一時刻只能有一條指令執行,但多個進程指令被快速輪換執行,使得在
宏觀上具有多個進程同時執行的效果。
線程
- 多線程擴展了多進程的概念,使得一個進程可以同時併發處理多個任務。線程也被稱爲輕量級進程,線程是進程的執行單元。當進程被初始化後,主線程就被創建了。
- 線程可以擁有自己的堆棧、自己的程序計數器和自己的局部變量,但不再擁有系統資源,它與父進程的其他線程共享改進程所擁有的全部資源。一個線程可以撤銷和創建另一個線程,同一個進程中的線程之間可以併發執行。
多線程的優點
- 進程間不能共享內存,但線程之間共享內存非常容易。
- 系統創建進程需要爲該進程重新分配系統資源,但創建線程代價小的多,因此使用多線程來實現多任務併發比多進程的效率高。
創建線程
- 使用實例方法,返回一個NSThread對象,必須調用start方法啓動線程:
NSThread *thread = [[NSThread alloc]initWithTarget:self
selector:@selector(run)
object:nil];
[thread start];
[NSThread detachNewThreadSelector:@selector(run)
toTarget:self withObject:nil];
程序可以通過setName:方法爲線程設置名字
線程狀態
- 當程序創建線程後,該線程處於新建狀態,僅僅由系統爲其分配了內存,並初始化其成員變量的值;當線程對象調用了start方法後,該線程處於就緒狀態,系統會爲其創建方法調用棧和程序計數器,處於這種狀態中的線程並沒有開始運行,它只是表示該線程可以運行了,至於何時運行取決於系統的調度。
- 如果希望調用子線程的start方法後子線程立即開始執行,程序可以使用[NSThread sleepForTimeInterval:0.001];讓當前運行的線程(主線程)睡眠1毫秒。
終止線程
線程會以一下3中方式之一結束:
- 線程執行體方法執行完成,線程正常結束
- 線程執行過程中出現了錯誤
- 直接調用NSThread類的exit方法來終止當前正在執行的線程
當主線程結束時,其他線程不受任何影響,並不會隨之結束。一旦子線程啓動起來後,它就
擁有和主線程相同的地位。爲了測試某個線程是否正在運行,可以調用線程對象的
isExecuting、isFinished方法;如果希望在UI中終止子線程,NSThread並沒有提供
方法來終止某個線程,可以通過先執行[thread cancel]改變線程狀態,然後在此線程
執行體方法中使用[NSThread currentThread].isCancelled判斷thread對象的狀態,
如果isCancelled爲YES,就使用[NSThread exit]終止當前子線程。
線程睡眠
如果需要將當前正在執行的線程暫停一段時間,並進入阻塞狀態,可以通過以下方法實現:
[NSThread sleepForTimeInterval:t];
[NSThread sleepUntilDate:aDate];
回調主線程刷新UI一般使用以下方法:
[self performSelectorOnMainThread:@selector(updateUI:)
withObject:image waitUntilDone:YES];
或者
dispatch_async(dispatch_get_main_queue(), ^{...});
改變線程的優先級
每個線程執行時都具有一定的優先級,優先級高的線程獲得較多的執行機會。NSThread提供如下方法設置獲取線程的優先級:
[NSThread threadPriority];
[thread threadPriority];
[NSThread setThreadPriority:priority];
[thread setThreadPriority:priority];