iOS 多線程 --- NSThread

一. NSThread開啟新的線程

1. 創(chuàng)建并啟動(dòng)線程

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(loadData) object:nil];
[thread start];

- (void)loadData{
    NSLog(@"%@", [NSThread currentThread]);
}
<NSThread: 0x600000eecc80>{number = 3, name = (null)}

2. 創(chuàng)建并啟動(dòng)線程

[NSThread detachNewThreadSelector:@selector(loadData) toTarget:self withObject:nil];

- (void)loadData{
    NSLog(@"%@", [NSThread currentThread]);
}
<NSThread: 0x6000028049c0>{number = 3, name = (null)}

3. 隱式創(chuàng)建線程并啟動(dòng)

[self performSelectorInBackground:@selector(loadData) withObject:nil];

- (void)loadData{
    NSLog(@"%@", [NSThread currentThread]);
}
<NSThread: 0x600001848cc0>{number = 3, name = (null)}

二. NSThread多線程常用相關(guān)方法

1. 線程屬性相關(guān)

// 獲得主線程
+ (NSThread *)mainThread;    
// 判斷是否為主線程(對(duì)象方法)
- (BOOL)isMainThread;
// 判斷是否為主線程(類方法)
+ (BOOL)isMainThread;    
// 獲得當(dāng)前線程
NSThread *thread = [NSThread currentThread];
// 線程的名字——setter方法
- (void)setName:(NSString *)n;    
// 線程的名字——getter方法
- (NSString *)name; 

2. 線程狀態(tài)控制相關(guān)

// 線程進(jìn)入就緒狀態(tài) -> 運(yùn)行狀態(tài)吁断。當(dāng)線程任務(wù)執(zhí)行完畢躲查,自動(dòng)進(jìn)入死亡狀態(tài)
// 啟動(dòng)線程方法
- (void)start;

// 阻塞(暫停)線程方法 
// 線程進(jìn)入阻塞狀態(tài)
+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;

// 強(qiáng)制停止線程
// 線程進(jìn)入死亡狀態(tài)
+ (void)exit;

3. 線程執(zhí)行操作相關(guān)

// 在主線程上執(zhí)行操作
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray<NSString *> *)array;
  // equivalent to the first method with kCFRunLoopCommonModes

// 在指定線程上執(zhí)行操作
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray *)array NS_AVAILABLE(10_5, 2_0);
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait NS_AVAILABLE(10_5, 2_0);

// 在當(dāng)前線程上執(zhí)行操作奸例,調(diào)用 NSObject 的 performSelector:相關(guān)方法
- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;

三. NSThread線程之間的通信

先開一個(gè)新的子線程執(zhí)行耗時(shí)操作轻猖,然后回到主線程中刷新UI甚颂。

[NSThread detachNewThreadSelector:@selector(loadData) toTarget:self withObject:nil];

- (void)loadData{
    NSLog(@"1.%@", [NSThread currentThread]);
    [NSThread sleepForTimeInterval:2.0];
    [self performSelectorOnMainThread:@selector(reloadUI) withObject:nil waitUntilDone:YES];
}
- (void)reloadUI{
    NSLog(@"2.%@", [NSThread currentThread]);
}
 1.<NSThread: 0x600001a57a80>{number = 3, name = (null)}
 2.<NSThread: 0x600001a062c0>{number = 1, name = main}

四. 線程安全

需求:有時(shí)候用爪,我們會(huì)在多個(gè)地方同時(shí)對(duì)同一個(gè)接口進(jìn)行調(diào)用顽照,那如果每次調(diào)用過程會(huì)對(duì)下一次調(diào)用的結(jié)果有影響(有修改或者更變等操作)无畔,那么我們就必須保證該接口同一時(shí)間只能被一個(gè)地方調(diào)用宅粥,這就是線程安全参袱。

- (void)viewDidLoad {
    [super viewDidLoad];
    for (int i = 0; i < 10; i ++) {
        [NSThread detachNewThreadSelector:@selector(loadData) toTarget:self withObject:nil];
    }
}
- (void)loadData{
    @synchronized (self) {
        // 模擬耗時(shí)操作
        [NSThread sleepForTimeInterval:1.0];
        NSLog(@"---");
    }
}

注:@synchronized的作用是創(chuàng)建一個(gè)互斥鎖,這個(gè)指令可以將{ }內(nèi)的代碼限制在一個(gè)線程執(zhí)行,如果某個(gè)線程沒有執(zhí)行完抹蚀,其他的線程如果需要執(zhí)行就得等著,起到線程的保護(hù)作用剿牺。

五. 線程狀態(tài)總結(jié)

線程狀態(tài)圖.png
  • 當(dāng)線程創(chuàng)建之后被啟動(dòng),進(jìn)入就緒狀態(tài)环壤。
  • 當(dāng)線程被CPU調(diào)度晒来,進(jìn)入運(yùn)行狀態(tài)
  • 當(dāng)CPU去調(diào)度其他線程郑现,回到就緒狀態(tài)湃崩。
  • 當(dāng)CPU在運(yùn)行當(dāng)前線程對(duì)象的時(shí)候調(diào)用了sleep方法或者等待同步鎖,進(jìn)入阻塞狀態(tài)接箫。等到sleep到時(shí)或者得到同步鎖攒读,則回到就緒狀態(tài)
  • 當(dāng)CPU在運(yùn)行當(dāng)前線程對(duì)象的時(shí)候線程任務(wù)執(zhí)行完畢或者異常強(qiáng)制退出辛友,則當(dāng)前線程對(duì)象進(jìn)入死亡狀態(tài)薄扁。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市废累,隨后出現(xiàn)的幾起案子邓梅,更是在濱河造成了極大的恐慌,老刑警劉巖邑滨,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件日缨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡驼修,警方通過查閱死者的電腦和手機(jī)殿遂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乙各,“玉大人墨礁,你說我怎么就攤上這事《停” “怎么了恩静?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蹲坷。 經(jīng)常有香客問我驶乾,道長,這世上最難降的妖魔是什么循签? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任级乐,我火速辦了婚禮,結(jié)果婚禮上县匠,老公的妹妹穿的比我還像新娘风科。我一直安慰自己撒轮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布贼穆。 她就那樣靜靜地躺著题山,像睡著了一般。 火紅的嫁衣襯著肌膚如雪故痊。 梳的紋絲不亂的頭發(fā)上顶瞳,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音愕秫,去河邊找鬼慨菱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛豫领,可吹牛的內(nèi)容都是我干的抡柿。 我是一名探鬼主播舔琅,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼等恐,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了备蚓?” 一聲冷哼從身側(cè)響起课蔬,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎郊尝,沒想到半個(gè)月后二跋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡流昏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年扎即,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片况凉。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谚鄙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出刁绒,到底是詐尸還是另有隱情闷营,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布知市,位于F島的核電站傻盟,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嫂丙。R本人自食惡果不足惜娘赴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望跟啤。 院中可真熱鬧诽表,春花似錦媳叨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至议双,卻和暖如春痘番,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背平痰。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工汞舱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宗雇。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓昂芜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赔蒲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泌神,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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

  • 單例模式例子: https://github.com/XiaoRuiZuo/Singleton 多線程:多線程是為...
    Lee堅(jiān)武閱讀 1,402評(píng)論 0 50
  • 進(jìn)程和線程 進(jìn)程 所有運(yùn)行中的任務(wù)通常對(duì)應(yīng)一個(gè)進(jìn)程,當(dāng)一個(gè)程序進(jìn)入內(nèi)存運(yùn)行時(shí),即變成一個(gè)進(jìn)程.進(jìn)程是處于運(yùn)行過程中...
    勝浩_ae28閱讀 5,108評(píng)論 0 23
  • 線程: 英文:Thread線程欢际,有時(shí)被稱為輕量級(jí)進(jìn)程(Lightweight Process,LWP)矾兜,是程序執(zhí)行...
    忽然之間_1988丶閱讀 248評(píng)論 0 1
  • NSThread:優(yōu)點(diǎn):NSThread 比其他兩個(gè)輕量級(jí) 缺點(diǎn):需要自己管理線程的生命周期损趋,線程同步。線程同步對(duì)...
    我是誰重要嗎閱讀 203評(píng)論 0 0
  • 金庸小說里周伯通的一大神奇武功叫做左右互搏術(shù)椅寺,是他被囚桃花島時(shí)百無聊賴之時(shí)發(fā)明出來的浑槽,這項(xiàng)神功就是設(shè)想左手是一個(gè)人...
    小熊童子閱讀 1,204評(píng)論 0 0