iOS中的多執行緒(關於NSThread)

語言: CN / TW / HK

highlight: a11y-dark theme: cyanosis


「這是我參與11月更文挑戰的第5天,活動詳情檢視:2021最後一次更文挑戰

關於NSThread

NSThread簡介

NSThread是蘋果官方提供面向物件操作執行緒的技術,簡單方便,可以直接操作執行緒物件,不過需要自己控制執行緒的生命週期。在平時使用很少,最常用到的無非就是 [NSThread currentThread]獲取當前執行緒


NSThread使用方法

  • 執行緒的建立

    • 通過 alloc init 進行建立 ```js //建立執行緒 NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(run:) object:@"text"]; thread.name = @"my-thread"; thread.threadPriority = 0.1;

      //啟動執行緒 [thread start]; `` - 通過detachNewThreadSelector` 方式建立並執行執行緒

      js //建立執行緒 [NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"text"]; - 隱式建立後自動啟動執行緒

      js //建立執行緒 [self performSelectorInBackground:@selector(run:) withObject:@"text"];

    總結:
    第一種方式:設定一些執行緒屬性;例如執行緒 名字,從控制檯資訊可以看出來,當設定了不同的 NSThread 物件的優先順序屬性,可以控制其執行的順序,優先順序越高,越先執行;而設定名字屬性後,可以通過除錯監控當前所處執行緒,便於問題分析

    第二、三種方式:建立和操作簡單

    示例

    ```js - (void)viewDidLoad {     [super viewDidLoad]; //建立執行緒 [self performSelectorInBackground:@selector(run:) withObject:@"text"]; }

    • (void)run:(NSString *)str{ for (NSInteger i = 0; i<10; i++) { NSLog(@"-run-%ld-%@--%@",(long)i,str,[NSThread currentThread]); if(i == 5){ [self performSelectorOnMainThread:@selector(runMainThread) withObject:nil waitUntilDone:YES]; } } }

    • (void)runMainThread{ NSLog(@"迴歸主執行緒--%@",[NSThread currentThread]); } ``` log:

    Snip20211103_30.png

  • 執行緒的狀態

    當我們新建一個執行緒物件的時候,系統就會為其分配一塊記憶體,當你呼叫執行緒的開始方法時,就相當於把這個執行緒放在了執行緒池裡面,等待CPU去呼叫它,當執行緒池中有多個執行緒,那麼CPU就會在這幾個執行緒之間來回切換,但是當執行緒呼叫了 sleep 或同步鎖時,該呼叫的執行緒就會被阻塞,當sleep或鎖結束時,CPU再次進行切換中,當執行緒任務執行完,該執行緒就會釋放。

NSThread相關方法

  • 獲取當前執行緒 js @property (class, readonly, strong) NSThread *currentThread;
  • 獲得主執行緒 ```js
    • (NSThread *)mainThread; ```
  • 判斷當前執行緒是否為主執行緒 ```js
    • (BOOL)isMainThread;
    • (BOOL)isMainThread; ```
  • 進入就緒狀態 -> 執行狀態。當執行緒任務執行完畢,自動進入死亡狀態

    js - (void)start; - 進入阻塞狀態

    js + (void)sleepUntilDate:(NSDate *)date; + (void)sleepForTimeInterval:(NSTimeInterval)time; - 強制停止執行緒,一旦執行緒停止(死亡)了,就不能再次開啟任務

    js + (void)exit;

示例

```js - (void)viewDidLoad {     [super viewDidLoad];

//建立執行緒
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];

}

  • (void)run{

NSLog(@"執行緒睡眠");     [NSThread sleepForTimeInterval:2];     NSLog(@"執行緒喚醒");

for (NSInteger a = 0; a<10; a++) {         NSLog(@"-執行");         if (a == 5){             NSLog(@"退出執行緒");             [NSThread exit];//退出執行緒             NSLog(@"不會列印");         }     } } ``` log:

Snip20211103_27.png