iOS-----多線程之NSThread

來源:互聯網
上載者:User

標籤:

     多線程

iOS平台提供了非常優秀的多線程支援,程式可以通過非常簡單的方式來啟動多線程,iOS平台不僅提供了NSThread類來建立多線程,還提供了GCD方式來簡化多線程編程,提供了NSOperation和NSOperationQueue支援多線程編程。總之,iOS已經儘力降低開發多線程應用的繁瑣,努力讓開發人員能輕鬆、簡單地開發多線程應用.

線程概述

幾乎所有的作業系統都支援同時運行多個任務,一個任務通常就是一個程式,每個運行中的程式就是一個進程.當一個程式運行時,內部可能包含了多個順序執行流,每個順序執行流就是一個線程.

任務->進程->線程

線程和進程

所有運行中的任務通常對應一個進程(Process),當一個程式進入記憶體運行後,即變成一個進程,進程是處於運行過程中的程式,並且具有一定的獨立功能,進程是系統進行資源分派和調度的一個獨立單位。

進程包含如下3個特徵

獨立性

進程是系統中獨立存在的實體,它可以擁有自己獨立的資源,每一個進程都擁有自己私人的地址空間。在沒有經過進程本身允許的情況下,一個使用者進程不可以直接存取其他進程的地址空間。

動態性

進程與程式的區別在於,程式只是一個靜態指令集合,而進程是一個正在系統中活動的指令集合。在進程中加入了時間的概念,進程具有自己的生命週期和各種不同的狀態,這些概念在程式中都是不具備的。

並發性

多個進程可以在單個處理器上並發執行,多個線程之間不會互相影響。

並發性(concurrency)和並行性(parallel)是兩個概念,

並行指在同一時刻,有多條指令在多個處理器上同時執行;

並髮指在在同一時刻只能有一條指令執行,但多個進程指令被快速輪換執行,使得在宏觀上具有多個進程同時執行的效果。

線 程

多線程使得同一個進程可以同時並發處理多個任務。線程(Thread)也被稱作輕量級進程(Lightweight Process),線程是進程的執行單元。線程在程式中是獨立的、並發的執行流。當進程被初始化後,主線程就被建立了。對於絕大多數的應用程式來說,通常僅要求有一個主線程,但是我們也可以在該進程內建立多條順序執行流,這些順序執行流就是線程,每條線程也是互相獨立的。

線程是進程的組成部分,一個進程可以擁有多個線程,一個線程必須有一個父進程。線程可以擁有自己的堆棧、自己的程式計數器和自己的局部變數,但不再擁有系統資源,它與父進程的其他線程共用該進程所擁有的全部資源。因為多個線程共用父進程裡的全部資源,因此編程更加方便;但必須更加小心,我們必須確保線程不會妨礙同一進程裡的其他線程

簡而言之:一個程式運行後至少有一個進程,一個進程裡可以包含多個線程,但至少要包含一個線程.作業系統可以同時執行多個任務,每個任務就是進程;進程可以同時執行多個任務,每個任務就是線程.

多線程的優勢

線程在程式中是獨立的、並發的執行流,與分隔的進程相比,進程中的線程之間的隔離程度要小。它們共用記憶體、檔案控制代碼和其他每個進程應用的狀態。同一個進程中的線程都有共性----多個線程將共用同一個進程虛擬空間。線程共用的環境包括:進程程式碼片段、進程的公有資料等。利用這些共用的資料等,線程很容易實現相互之間的通訊。

多線程的優點

1

進程間不能共用記憶體,但線程之間共用記憶體非常容易。

2

系統建立進程需要為該進程重新分配系統資源,但建立線程則代價小得多,因此使用多線程來實現多任務並發比多進程的效率高。

3

iOS提供了多種多線程實現方式,從而簡化了iOS的多線程編程。

iOS大致提供了如下3種多線程編程的技術

1

使用NSThread實現多線程。

2

使用NSOperation與NSOperationQueue實現多線程

3

使用GCD(Grand Central Dispatch)實現多線程

使用NSThread實現多線程

iOS使用NSThread類代表線程,建立新線程也就是建立NSThread對象。

建立和啟動線程

建立NSThread有兩種方式。

-(id)initWithTarget:(id)target selector:(SEL)selector object:(id)arg

建立一個新線程對象

+ (void)detachNewThreadSelector:(SEL)selector object:(id)target withObject:(id)arg

建立並啟動新線程

+ currentThread:

currentThread是NSThread類的類方法,該方法總是返回當前正在執行的線程對象

setName:

可以通過name方法返回指定線程的名字

上面兩種方式的本質都是將target對象的selector方法轉換為線程執行體,其中selector方法最多可以接收一個參數,而arg就代表傳給selector方法的參數.

target對象的selector方法的方法體代表了線程需要完成的任務,因此相當於把target對象的selector方法轉換為線程執行體.

  第1種方式是一個執行個體方法,該方法返回一個NSThread對象,必須調用start方法啟動線程

  第2種方式不會返回NSThread對象,因此這種方式直接建立並啟動線程.

     
線程的狀態

啟動線程使用start方法,線程啟動之後並不是立即進入運行狀態,線程被啟動後處於就緒狀態,當系統調整線程後,線程才會進入運行狀態.

如果程式希望調用子線程的start方法後子線程立即開始執行,程式可以使用[NSThread sleepForTimeInterval:0.001];

讓當前啟動並執行線程(主線程)睡眠1毫秒---1毫秒就夠了,因為在這1毫秒內CPU不會空閑,它會去執行另一個處於就緒狀態的線程,這樣就可以讓子線程立即獲得執行.

終止子線程

線程會以以下3種方式之一結束,結束後就處於死亡狀態.

  線程執行體方法執行完成,線程正常結束.

  線程執行過程中出現錯誤

  直接調用NSThread類的exit方法來中止當前正在執行的線程.

注意

當主線程結束時,其他線程不受任何影響,並不會隨之結束.一旦子線程啟動起來後,它就擁有和主線程相同的地位,它不會受主線程的影響.

為了測試某個線程是否正在運行,可以調用線程對象的isExcuting、isFinished方法,當線程正處於執行過程中時,調用isExecuting方法就會返回YES;當線程執行完成後,調用isFinished方法就會返回YES。

 

  上面程式中①號代碼調用了thread對象的cancel方法,該方法用於向thread對象發送取消訊號,這樣即可使得thread對象的isCancelled方法

返回YES------接下來程式線上程執行體方法中線判斷thread對象d的isCancelled是否為YES,如果該對象的isCancelled為YES,程式就調用Thread類的exit方法終止當前正在執行的迴圈,這樣就可以從UI線程終止子線程了.

線程睡眠

需要讓當前正在執行的線程暫停一段時間,並進入阻塞狀態,則可以通過調用NSThread類的靜態。sleepXxx方法來完成。

NSThread類提供了如下兩個控制線程暫停類方法

+(void)sleepUntilDate:(NSDate *)aDate:

讓當前正在執行的線程暫停到aDate代表的時間,並進入阻塞狀態

+(void)sleepForTimeInterval:(NSTimeInterval)ti:

讓當前正在執行的線程暫停ti秒,並進入阻塞狀態.

噹噹前線程調用sleepXxx方法進入阻塞狀態後,在其睡眠時間段內,該線程不會獲得執行的機會,即使系統中沒有其他科執行的線程,處於阻塞狀態的線程也不會執行,因此sleepXxx方法常用來暫停線程的執行.

[NSThread sleepForTimeInterval:0.5];

用於控制當前正在執行的線程暫停0.5秒

iOS-----多線程之NSThread

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.