天天看點

多線程 —— NSThread

什麼是程序? 程序是指在系統中 正在運作 的一個應用程式 每個程序之間是 獨立 的 , 每個程序均運作在其專用且受保護的記憶體空間内 (說白了就是一塊獨立的記憶體空間)

什麼是線程? 1 個程序要想執行任務, 必須 得有線程( 每 1 個程序至少要有 1 條線程 ) 線程是程序的基本執行單元 ,一個程序(程式)的所有任務都線上程中執行

多線程 —— NSThread

NSThread的使用:

一個 NSThread 對象就代表一條線程

建立、啟動線程

// 建立線程方式1
- (void)test1
{
    // 執行個體化一個線程對像
    // target:誰要建立線程
    // selector:為那個方法開辟線程
    // objec:傳給run方法的參數
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:nil];
    
    // 讓線程開始工作,啟動線程, 在新開的線程執行run方法
    [thread start];
    
}

// 建立線程方式2
- (void)test2
{
    [NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"hello"];
    
}

// 建立線程方式3
- (void)test3
{
    // “隐式”建立線程方式
    [self performSelectorInBackground:@selector(run:) withObject:@"cz"];
}
           

第2種與第3種建立方式的優缺點: 優點:簡單快捷,建立後自動啟動 缺點:無法擷取線程對象,也就無法對線程進行更詳細的設定

主線程相關用法

+ (NSThread *)mainThread; //獲得主線程

- (BOOL)isMainThread; //是否為主線程

+ (BOOL)isMainThread; //是否為主線程

其他用法

獲得目前線程

NSThread*current = [NSThread currentThread];

線程的排程優先級

+ (double)threadPriority;

+ (BOOL)setThreadPriority:(double)p;

- (double)threadPriority;

- (BOOL)setThreadPriority:(double)p;

NSThread *threadA = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:@"hello"];
    
    threadA.name = @"thraed A";
    
    // 線程優先級
    // 是一個浮點數,0.0~1.0。 預設值 0.5
    // 開發的時候,一般不去修改優先級的值。
    // 優先級,必須調用很多次的時候,才能展現出來。
    threadA.threadPriority = 0.1;
    
    // 開始工作
    [threadA start];
           

排程優先級的取值範圍是0.0 ~ 1.0,預設0.5,值越大,優先級越高

線程的 名字

- (void)setName:(NSString *)n;

-( NSString*)name;

線程的狀态

多線程 —— NSThread

控制線程狀态

啟動線程 // 進入就緒狀态 ->運作狀态。當線程任務執行完畢,自動進入死亡狀态

- (void)start;

阻塞 (暫停)線程 // 進入阻塞狀态

+ (void)sleepUntilDate:(NSDate*)date;

+ (void)sleepForTimeInterval:(NSTimeInterval)ti;

強制停止線程 // 進入死亡狀态

+ (void)exit;

注意:一旦線程停止(死亡)了,就不能再次開啟任務

多線程的安全隐患

1 塊資源可能會被多個線程共享,也就是 多個線程可能會通路同一塊資源 當多個線程通路同一塊資源時,很容易引發 資料錯亂和資料安全 問題 安全隐患解決 – 互斥鎖

互斥鎖使用格式

@synchronized(鎖對象) { // 需要鎖定的代碼  }

開發的時候,一般就使用self就OK

蘋果不推薦我們使用加鎖。因為加鎖,性能太差。

注意:鎖定1份代碼隻用1把鎖,用多把鎖是無效的

互斥鎖的優缺點 優點:能有效防止因多線程搶奪資源造成的資料安全問題 缺點:需要消耗大量的 CPU 資源

互斥鎖的使用前提 : 多條線程搶奪同一塊資源

相關專業術語: 線程同步 線程同步的意思是:多條線程在同一條線上執行(按順序地執行任務) 互斥鎖,就是使用了線程同步技術

線程間通信 什麼叫做線程間通信 在 1 個程序中,線程往往不是孤立存在的,多個線程之間需要經常進行通信

線程間通信的展現 1 個線程傳遞資料給另 1 個線程 在 1 個線程中執行完特定任務後,轉到另 1 個線程繼續執行任務

線程間通信常用方法

//在主線程執行 selector 方法

//(id)arg:傳遞給selector方法的參數

//(BOOL)wait:是否等待selector方法執行結束

- (void)performSelectorOnMainThread:(SEL)aSelector  withObject:(id)arg  waitUntilDone:(BOOL)wait;

// 在指定線程執行selector方法

- (void)performSelector:(SEL)aSelector  onThread:(NSThread *)thr  withObject:(id)arg  waitUntilDone:(BOOL)wait;