iOS多線程

線程和進程

一般而言進程包含如下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]終止當前子線程。

線程睡眠

如果需要將當前正在執行的線程暫停一段時間,並進入阻塞狀態,可以通過以下方法實現:

//讓當前正在執行的線程暫停t秒,並進入阻塞狀態
[NSThread sleepForTimeInterval:t];
//讓當前執行的線程暫停到aDate代表的時間,並進入阻塞狀態
[NSThread sleepUntilDate:aDate];

回調主線程刷新UI一般使用以下方法:

[self performSelectorOnMainThread:@selector(updateUI:)
                       withObject:image waitUntilDone:YES];
或者
dispatch_async(dispatch_get_main_queue(), ^{...});

改變線程的優先級

每個線程執行時都具有一定的優先級,優先級高的線程獲得較多的執行機會。NSThread提供如下方法設置獲取線程的優先級:

//該類方法獲取當前正在執行的線程的優先級
[NSThread threadPriority];
//該實例方法獲取調用該方法的線程對象的優先級
[thread threadPriority];
//該類方法用於設置當前正在執行的線程的優先級,參數可以是double類型的0.0~1.0的浮點數
[NSThread setThreadPriority:priority];
//該實例方法用於設置該方法的線程對象的優先級
[thread setThreadPriority:priority];
發佈了29 篇原創文章 · 獲贊 6 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章