【iOS重學(xué)】線程被活

寫在前面

本文主要講一下線程保活是什么赖舟、線程北鲎ィ活的意義裕偿、如何實(shí)現(xiàn)線程蓖吹ィ活旭绒。

線程保活

線程生命周期

1.png

【新建】:創(chuàng)建一個(gè)線程對(duì)象重父。
【就緒】:線程調(diào)用start方法忽匈,將線程加入可調(diào)度線程池中丹允,等著CPU的調(diào)度。
【運(yùn)行】:CPU調(diào)度當(dāng)前線程執(zhí)行折柠。
【阻塞】:當(dāng)滿足某個(gè)預(yù)設(shè)的條件時(shí)(比如休眠或者同步鎖)會(huì)阻塞線程執(zhí)行批狐,重新將線程設(shè)置為【就緒】狀態(tài)嚣艇。
【死亡】:線程任務(wù)執(zhí)行完畢或強(qiáng)制退出,線程生命周期結(jié)束巷懈。

什么是線程被藕椋活

線程贝毡#活:一般情況下,當(dāng)線程執(zhí)行玩一次任務(wù)之后需要進(jìn)行資源回收也就意味著生命周期結(jié)束频伤,線程敝ゴ耍活就是保證線程的生命周期不結(jié)束。

線程卑陡活的應(yīng)用場(chǎng)景

當(dāng)一個(gè)任務(wù)隨時(shí)都有可能去執(zhí)行它怎炊,那么這個(gè)任務(wù)應(yīng)該放在子線程去執(zhí)行,并且讓子線程一直存活债查,避免頻繁創(chuàng)建線程而造成的性能損耗瓜挽。
大家如果看過AFNetworking的源碼就會(huì)看到框架里面是有用到線程本贸龋活的。

如何實(shí)現(xiàn)線程卑溃活

// WWPermenantThread 類
@interface WWPermenantThread : NSObject

/**
 關(guān)閉線程
 */
- (void)stop;

/// 在钡叻牛活的線程里面執(zhí)行的任務(wù)
/// @param target 目標(biāo)對(duì)象
/// @param action selector
/// @param object object
- (void)excuteTaskWithTarget:(id)target action:(SEL)action object:(id)object;

/// 在保活的線程里執(zhí)行任務(wù)
/// @param task 執(zhí)行的任務(wù)
- (void)excuteTask:(void(^)(void))task;

@end

@interface WWPermenantThread ()

@property (nonatomic, strong) NSThread *innerThread;
@property (nonatomic, assign) BOOL isStopped;

@end

@implementation WWPermenantThread

- (void)dealloc {
    NSLog(@"%s",__func__);
    [self stop];
}

- (instancetype)init {
  if (self = [super init]) {
    self.isStopped = NO;

    __weak typeof(self) weakSelf = self;
    self.innerThread = [[NSThread alloc] initWithBlock:^{
      // 添加Port到RunLoop
      [[NSRunLoop currentRunLoop] addPort:[[NSPort alloc] init] forMode:NSDefaultRunLoopMode];
      while (weakSelf && !weakSelf.isStopped) {
        // 開啟RunLoop
          [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
      }
    }];
    [self.innerThread start];
  }
  return self;
}

- (void)run {
  if (!self.innerThread) {
      return;
  }
  [self.innerThread start];
}

- (void)stop {
  if (!self.innerThread) {
      return;
  }
  [self performSelector:@selector(__stop) onThread:self.innerThread withObject:nil waitUntilDone:YES];
}

- (void)__stop {
  self.isStopped = YES;
  // 退出當(dāng)前RunLoop
  CFRunLoopStop(CFRunLoopGetCurrent());
  self.innerThread = nil;
}

- (void)excuteTaskWithTarget:(id)target action:(SEL)action object:(id)object {
  if (!self.innerThread) {
      return;
  }
  [self performSelector:action onThread:self.innerThread withObject:object waitUntilDone:NO ];
}

- (void)excuteTask:(void (^)(void))task {
  if (!self.innerThread || !task) {
      return;
  }
  [self performSelector:@selector(__excuteTask:) onThread:self.innerThread withObject:task waitUntilDone:NO ];
}

- (void)__excuteTask:(void(^)(void))task {
  task();
}

@end

如何使用線程笨愿遥活

- (void)viewDidLoad {
  [super viewDidLoad];
  // 創(chuàng)建一個(gè)線程對(duì)象
  self.thread = [[WWPermenantThread alloc] init];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
  [self.thread excuteTask:^{
      NSLog(@"執(zhí)行任務(wù) - %@", [NSThread currentThread]);
  }];
}

執(zhí)行結(jié)果:

2023-02-15 10:18:56.211402+0800 線程迸鲂祝活Demo1[10526:21512893] 執(zhí)行任務(wù) - <NSThread: 0x600002e99680>{number = 9, name = (null)}
2023-02-15 10:18:56.830085+0800 線程保活Demo1[10526:21512893] 執(zhí)行任務(wù) - <NSThread: 0x600002e99680>{number = 9, name = (null)}
2023-02-15 10:18:57.279150+0800 線程甭雇眨活Demo1[10526:21512893] 執(zhí)行任務(wù) - <NSThread: 0x600002e99680>{number = 9, name = (null)}
2023-02-15 10:18:58.212741+0800 線程庇停活Demo1[10526:21512893] 執(zhí)行任務(wù) - <NSThread: 0x600002e99680>{number = 9, name = (null)}
2023-02-15 10:19:32.672529+0800 線程保活Demo1[10526:21512038] -[OneViewController dealloc]
2023-02-15 10:19:32.672800+0800 線程毙笪活Demo1[10526:21512038] -[WWPermenantThread dealloc]

寫在最后

關(guān)于如何實(shí)現(xiàn)線程崩常活的筆記就記錄到這里了凄鼻,如有錯(cuò)誤請(qǐng)多多指教腊瑟,最后歡迎去我的個(gè)人技術(shù)博客逛逛。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末块蚌,一起剝皮案震驚了整個(gè)濱河市闰非,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌峭范,老刑警劉巖财松,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡辆毡,警方通過查閱死者的電腦和手機(jī)菜秦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舶掖,“玉大人球昨,你說我怎么就攤上這事》枚停” “怎么了褪尝?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)期犬。 經(jīng)常有香客問我河哑,道長(zhǎng),這世上最難降的妖魔是什么龟虎? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任璃谨,我火速辦了婚禮,結(jié)果婚禮上鲤妥,老公的妹妹穿的比我還像新娘佳吞。我一直安慰自己,他們只是感情好棉安,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布底扳。 她就那樣靜靜地躺著,像睡著了一般贡耽。 火紅的嫁衣襯著肌膚如雪衷模。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天蒲赂,我揣著相機(jī)與錄音阱冶,去河邊找鬼。 笑死滥嘴,一個(gè)胖子當(dāng)著我的面吹牛木蹬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播若皱,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼镊叁,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了走触?” 一聲冷哼從身側(cè)響起晦譬,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饺汹,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痰催,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兜辞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年迎瞧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逸吵。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凶硅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扫皱,到底是詐尸還是另有隱情足绅,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布韩脑,位于F島的核電站氢妈,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏段多。R本人自食惡果不足惜首量,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望进苍。 院中可真熱鬧加缘,春花似錦、人聲如沸觉啊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)杠人。三九已至勋乾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搜吧,已是汗流浹背市俊。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滤奈,地道東北人摆昧。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蜒程,于是被迫代替她去往敵國(guó)和親绅你。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容