1. 程式人生 > >iOS多執行緒--徹底學會多執行緒之『pthread、NSThread』

iOS多執行緒--徹底學會多執行緒之『pthread、NSThread』

轉載於作者:行走的少年郎
連結:http://www.jianshu.com/p/cbaeea5368b1

1. pthread

pthread簡單介紹下,pthread是一套通用的多執行緒的API,可以在Unix / Linux / Windows 等系統跨平臺使用,使用C語言編寫,需要程式設計師自己管理執行緒的生命週期,使用難度較大,所以我們在iOS開發中幾乎不使用pthread,簡單瞭解下就可以了。

引自 百度百科 POSIX執行緒(POSIX threads),簡稱Pthreads,是執行緒的POSIX標準。該標準定義了建立和操縱執行緒的一整套API。在類Unix作業系統(Unix、Linux、Mac OS X等)中,都使用Pthreads作為作業系統的執行緒。Windows作業系統也有其移植版pthreads-win32。

引自 維基百科 POSIX執行緒(英語:POSIX Threads,常被縮寫為Pthreads)是POSIX的執行緒標準,定義了建立和操縱執行緒的一套API。 實現POSIX 執行緒標準的庫常被稱作Pthreads,一般用於Unix-like POSIX 系統,如Linux、Solaris。但是Microsoft Windows上的實現也存在,例如直接使用Windows API實現的第三方庫pthreads-w32;而利用Windows的SFU/SUA子系統,則可以使用微軟提供的一部分原生POSIX API。

1.pthread的使用方法

  1. 首先要包含標頭檔案#import <pthread.h>
  2. 其次要建立執行緒,並開啟執行緒執行任務
// 建立執行緒——定義一個pthread_t型別變數
pthread_t thread;
// 開啟執行緒——執行任務
pthread_create(&thread, NULL, run, NULL);

void * run(void *param)    // 新執行緒呼叫方法,裡邊為需要執行的任務
{
    NSLog(@"%@", [NSThread currentThread]);

    return NULL;
}
  • pthread_create(&thread, NULL, run, NULL); 中各項引數含義:
    • 第一個引數&thread是執行緒物件
    • 第二個和第四個是執行緒屬性,可賦值NULL
    • 第三個run表示指向函式的指標(run對應函式裡是需要在新執行緒中執行的任務)

2. NSThread

NSThread是蘋果官方提供的,使用起來比pthread更加面向物件,簡單易用,可以直接操作執行緒物件。不過也需要需要程式設計師自己管理執行緒的生命週期(主要是建立),我們在開發的過程中偶爾使用NSThread。比如我們會經常呼叫[NSThread currentThread]來顯示當前的程序資訊。

下邊我們說說NSThread如何使用。

1. 建立、啟動執行緒

  • 先建立執行緒,再啟動執行緒
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[thread start];    // 執行緒一啟動,就會線上程thread中執行self的run方法
  • 建立執行緒後自動啟動執行緒
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
  • 隱式建立並啟動執行緒
[self performSelectorInBackground:@selector(run) withObject:nil];

2. 執行緒相關用法

// 獲得主執行緒
+ (NSThread *)mainThread;    

// 判斷是否為主執行緒(物件方法)
- (BOOL)isMainThread;

// 判斷是否為主執行緒(類方法)
+ (BOOL)isMainThread;    

// 獲得當前執行緒
NSThread *current = [NSThread currentThread];

// 執行緒的名字——setter方法
- (void)setName:(NSString *)n;    

// 執行緒的名字——getter方法
- (NSString *)name;

3. 執行緒狀態控制方法

  • 啟動執行緒方法
- (void)start;
// 執行緒進入就緒狀態 -> 執行狀態。當執行緒任務執行完畢,自動進入死亡狀態
  • 阻塞(暫停)執行緒方法
+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;
// 執行緒進入阻塞狀態
  • 強制停止執行緒
+ (void)exit;
// 執行緒進入死亡狀態

4. 執行緒的狀態轉換

當我們新建一條執行緒NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];,在記憶體中的表現為:


當呼叫[thread start];後,系統把執行緒物件放入可排程執行緒池中,執行緒物件進入就緒狀態,如下圖所示。


當然,可排程執行緒池中,會有其他的執行緒物件,如下圖所示。在這裡我們只關心左邊的執行緒物件。


下邊我們來看看當前執行緒的狀態轉換。

  • 如果CPU現在排程當前執行緒物件,則當前執行緒物件進入執行狀態,如果CPU排程其他執行緒物件,則當前執行緒物件回到就緒狀態。
  • 如果CPU在運行當前執行緒物件的時候呼叫了sleep方法\等待同步鎖,則當前執行緒物件就進入了阻塞狀態,等到sleep到時\得到同步鎖,則回到就緒狀態。
  • 如果CPU在運行當前執行緒物件的時候執行緒任務執行完畢\異常強制退出,則當前執行緒物件進入死亡狀態。

只看文字可能不太好理解,具體當前執行緒物件的狀態變化如下圖所示。


相關推薦

iOS執行--徹底學會執行pthreadNSThread

轉載於作者:行走的少年郎連結:http://www.jianshu.com/p/cbaeea5368b11. pthread pthread簡單介紹下,pthread是一套通用的多執行緒的API,可以在Unix / Linux / Windows 等系統跨平臺使用,使用C語言編寫,需要程式設計師自己管理執行

iOS執行--徹底學會執行RunLoop

連結:http://www.jianshu.com/p/d260d18dd551 文章目錄 RunLoop簡介 1.1 什麼是RunLoop? 1.2 RunLoop和執行緒 1.3 預設情況下主執行緒的RunLoop原理 RunLoop相關類 2.1 CFRunLoopRef 2.2 CFRunLoop

iOS執行-pthreadNSThread

pthread pthread 簡介 pthread 是一套通用的多執行緒的 API,可以在Unix / Linux / Windows/Mac OS/iOS等系統跨平臺使用,使用 C 語言編寫,需要程式設計師自己管理執行緒的生命週期,使用難度

ios開發網路-大檔案的執行斷點下載

說明:本文介紹多執行緒斷點續傳。專案中使用了蘋果自帶的類,實現了同時開啟多條執行緒下載一個較大的檔案。 因為實現過程較為複雜, 實現思路:下載 開始,建立一個與要下載檔案大小相同的檔案(如果要下載100M,那麼就在沙盒建立一個100M的檔案,然後計算每一段的下載量,開啟多條執行緒下載各段的資料,分

JAVA執行————一篇文章讓你徹底征服執行開發(一)

多執行緒的基本概念 執行緒指程序中的一個執行場景,也就是執行流程,那麼程序和執行緒有什麼區別呢? 每個程序是一個應用程式,都有獨立的記憶體空間 同一個程序中的執行緒共享其程序中的記憶體和資源(共享的記憶體是堆記憶體和方法區記憶體,棧記憶體不共享,

一篇文章讓你徹底征服執行開發

多執行緒的基本概念 執行緒指程序中的一個執行場景,也就是執行流程,那麼程序和執行緒有什麼區別呢? 每個程序是一個應用程式,都有獨立的記憶體空間 同一個程序中的執行緒共享其程序中的記憶體和資源(共享的記憶體是堆記憶體和方法區記憶體,棧記憶體不共享,

JAVA執行————一篇文章讓你徹底征服執行開發

多執行緒的基本概念執行緒指程序中的一個執行場景,也就是執行流程,那麼程序和執行緒有什麼區別呢?每個程序是一個應用程式,都有獨立的記憶體空間同一個程序中的執行緒共享其程序中的記憶體和資源(共享的記憶體是堆記憶體和方法區記憶體,棧記憶體不共享,每個執行緒有自己的。)什麼是程序?一

ios執行初步,主執行重新整理UI

去研究一下iOS多執行緒的起因是自己程式裡用了一個等待指示器UIActivityIndicatorView,俗稱小菊花。但是在給頂層ViewController用addsubview加入這個控制元件並使轉動時,螢幕並沒有出現菊花。經過好一番除錯都沒找到原因。去網

java執行:結合執行交替列印10次abc例項,對wait/notify使用的徹底理解

有個朋友看點選開啟連結 裡的三個執行緒“A執行緒列印10次A,B執行緒列印10次B,C執行緒列印10次C,要求執行緒同時執行,交替列印10次ABC。” 這個問題的程式碼,有點不太理解,讓我給看下。不

iOS張圖片上傳執行處理方法(可獲取最後一張上傳狀態後的訊號)

環境重現 1,服務端提供單張上傳的介面。 2,客戶端需求同時提交多張圖片上傳。 3,使用AFNetWorking 或 自封裝的帶有block回撥網路狀態的框架。 思路 1,建立一個管理類。 2,提供一個單例方法。保證管理類唯一 3,提供一個公共

iOS 開發執行及其程序和執行的介紹和理解

iOS開發多執行緒篇—多執行緒簡單介紹 一、程序和執行緒 1.什麼是程序 程序是指在系統中正在執行的一個應用程式 每個程序之間是獨立的,每個程序均執行在其專用且受保護的記憶體空間內 比如同時開啟QQ、Xcode,系統就會分別啟動2個程序 通過“活動監視器”可以檢視Mac系統中所開啟的程序 2.什

輕鬆學會執行(三)——如何確定執行

一般情況下,在網際網路程式設計中,我們會使用多執行緒來搶奪網路資源。那麼,執行緒數量我們如何來確定呢? 我們都知道,執行緒數量和CPU核數有關。所以有人建議說:執行緒數為核數的兩倍最好。 其實只要這些執行緒不頻繁切換、競爭資源的話。想要最優效能,還是根據具體專案慢慢除錯。

執行池中執行設定超時退出監控

前言 在寫多執行緒程式時,大多數情況下會先excutor建立執行緒池,然後再建立執行緒,但是對一些讀資料庫或者其他IO操作,容易堵住執行緒,此時就需要給執行緒設定超時時間,幹掉超時的執行緒再重新拉起一個執行緒來,但是java執行緒建立並沒有預留超時引數,研究了一下網上也沒找到

33-多執行緒--賣票示例+執行緒安全(產生原因+解決方式:同步)+同步(同步程式碼塊+同步的好處與弊端+同步的前提+同步函式+賣票示例的同步函式寫法+驗證同步函式的鎖+驗證靜態同步函式的鎖)

一、賣票示例 需求:四個視窗,同時售賣100張票,票號為1-100 1、沒有多執行緒時的賣票程式碼 class Ticket { //100張票 private int num = 100; public void sale() { /

觀察者模式中執行執行訂閱事件並順序執行的問題

       對事件釋出訂閱模式中啟動執行緒執行操作,但又要保證執行緒順序執行的一些思考和實踐,在開發過程中,經常會遇到需要使用事件來觸發方法執行的情況,比如CS中按鈕的點選事件,滑鼠移動事件,鍵盤監聽事件等等,有時候需要執行比較耗時的任務,但並不希望阻塞主執

執行基礎二(執行的啟動終止,執行面臨的三種問題)

一、執行緒的啟動、終止方式   啟動: start native(呼叫外部介面啟動)     終止:    stop(類似kill,暴力終止)  interrupt 中斷的方式 通過指令的方式 volatile boolean stop

Java執行系列--“JUC原子類”03 AtomicLong原子類

轉自:https://www.cnblogs.com/skywang12345/p/3514593.html(含部分修改) 概要 AtomicInteger, AtomicLong和AtomicBoolean這3個基本型別的原子類的原理和用法相似。本章以AtomicLong對基本型別的原子類進行介紹。內容

Java執行系列---“JUC原子類”04 AtomicLongArray原子類

轉自:https://www.cnblogs.com/skywang12345/p/3514604.html(含部分修改) 概要 AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray這3個數組型別的原子類的原理和用法相似。本章以AtomicLo

Java執行系列---“JUC原子類”05 AtomicReference原子類

轉自:http://www.cnblogs.com/skywang12345/p/3514623.html(部分修改) 概要 本章對AtomicReference引用型別的原子類進行介紹。內容包括: AtomicReference介紹和函式列表 AtomicReference原始碼分析(基於J

Java執行系列---“JUC原子類”06 AtomicLongFieldUpdater原子類

轉自:http://www.cnblogs.com/skywang12345/p/3514635.html (含部分修改) 概要 AtomicIntegerFieldUpdater, AtomicLongFieldUpdater和AtomicReferenceFieldUpdater這3個修改類的成員的原