NSThread簡(jiǎn)單介紹

NSThread

  • 父類是NSObject

(1)NSThread的創(chuàng)建

//第一種創(chuàng)建線程的方式:alloc initWithTarget.
//特點(diǎn):需要手動(dòng)開(kāi)啟線程蛇券,可以拿到線程對(duì)象進(jìn)行詳細(xì)設(shè)置
    //創(chuàng)建線程
    /*
     第一個(gè)參數(shù):目標(biāo)對(duì)象
     第二個(gè)參數(shù):選擇器漱挎,線程啟動(dòng)要調(diào)用哪個(gè)方法
     第三個(gè)參數(shù):前面方法要接收的參數(shù)(最多只能接收一個(gè)參數(shù),沒(méi)有則傳nil)
     */
    NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(run:) object:@"wendingding"];
     //啟動(dòng)線程
    [thread start];

//第二種創(chuàng)建線程的方式:分離出一條子線程
//特點(diǎn):自動(dòng)啟動(dòng)線程侧巨,無(wú)法對(duì)線程進(jìn)行更詳細(xì)的設(shè)置
    /*
     第一個(gè)參數(shù):線程啟動(dòng)調(diào)用的方法
     第二個(gè)參數(shù):目標(biāo)對(duì)象
     第三個(gè)參數(shù):傳遞給調(diào)用方法的參數(shù)
     */
    [NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"我是分離出來(lái)的子線程"];

//第三種創(chuàng)建線程的方式:后臺(tái)線程
//特點(diǎn):自動(dòng)啟動(dòng)線程,無(wú)法對(duì)線程進(jìn)行更詳細(xì)設(shè)置
[self performSelectorInBackground:@selector(run:) withObject:@"我是后臺(tái)線程"];

//第四種創(chuàng)建線程的方式:alloc init
//特點(diǎn):任務(wù)封裝在自定義對(duì)象的main方法中习贫,不暴露
    NSThread *thread = [[NSThread alloc]init];

    //啟動(dòng)任務(wù)
    [thread start];

(2)設(shè)置線程的屬性

   //設(shè)置線程的屬性
    //設(shè)置線程的名稱
    thread.name = @"線程A";

    //設(shè)置線程的優(yōu)先級(jí),注意線程優(yōu)先級(jí)的取值范圍為0.0~1.0之間略贮,1.0表示線程的優(yōu)先級(jí)最高,如果不設(shè)置該值,那么理想狀態(tài)下默認(rèn)為0.5
    thread.threadPriority = 1.0;

(3)線程的狀態(tài)(了解)


線程的狀態(tài).png
//常用的控制線程狀態(tài)的方法
[thread start];//進(jìn)入就緒狀態(tài)茧跋,等待運(yùn)行
[NSThread sleepForTimeInterval:2.0];//阻塞線程
[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]];//阻塞線程
[NSThread exit];//強(qiáng)制退出當(dāng)前線程

//注意:線程死了不能復(fù)生,線程死了與線程對(duì)象是否釋放無(wú)關(guān)(可用成員屬性強(qiáng)指針指向某線程卓囚,線程對(duì)象存在瘾杭,但線程任務(wù)完成時(shí)依然會(huì)“死”)
//通過(guò)break,return提前結(jié)束任務(wù),是正常死亡而非強(qiáng)制讓線程死亡

(4)線程安全


線程安全.png

互斥鎖.png
01 前提:多個(gè)線程訪問(wèn)同一塊資源會(huì)發(fā)生數(shù)據(jù)安全問(wèn)題哪亿,“同一塊資源”:比如同一個(gè)對(duì)象粥烁、同一個(gè)變量、同一個(gè)文件

02 解決方案:加互斥鎖
    2.1 實(shí)質(zhì):通過(guò)線程同步蝇棉,使同一塊資源在同一時(shí)間只能被一個(gè)線程訪問(wèn)页徐,其余線程等待訪問(wèn)
    2.2 優(yōu)點(diǎn):能有效防止因多線程搶奪資源造成的數(shù)據(jù)安全問(wèn)題
    2.3 缺點(diǎn):需要消耗大量的CPU資源

03 相關(guān)代碼:@synchronized(self){}
    3.1 鎖定1份代碼只用1把鎖,用多把鎖是無(wú)效的
    3.2 鎖對(duì)象一般使用self
@synchronized(鎖對(duì)象) { // 需要鎖定的代碼  }

04 專業(yè)術(shù)語(yǔ)-線程同步
    4.1 線程同步即多條線程在同一條線上執(zhí)行(按順序地執(zhí)行任務(wù))
    4.2 互斥鎖使用了線程同步技術(shù)

05 原子和非原子屬性(主要是對(duì)setter方法加鎖)
    5.1 OC在定義屬性時(shí)有nonatomic和atomic兩種選擇
        5.1-1 atomic:原子屬性银萍,為setter方法加鎖(默認(rèn)就是atomic)变勇;線程安全,需要消耗大量的資源
        5.1-2 nonatomic:非原子屬性贴唇,不會(huì)為setter方法加鎖搀绣;非線程安全,適合內(nèi)存小的移動(dòng)設(shè)備
    5.2 iOS開(kāi)發(fā)的建議
        5.2-1 所有屬性都聲明為nonatomic
        5.2-2 盡量避免多線程搶奪同一塊資源
        5.2-3 盡量將加鎖戳气、資源搶奪的業(yè)務(wù)邏輯交給服務(wù)器端處理链患,減小移動(dòng)客戶端的壓力

(5)線程間通信

01 在1個(gè)進(jìn)程中,線程往往不是孤立存在的瓶您,多個(gè)線程之間需要經(jīng)常進(jìn)行通信
02 線程間通信的體現(xiàn)
    2-1 1個(gè)線程傳遞數(shù)據(jù)給另1個(gè)線程
    2-2 在1個(gè)線程中執(zhí)行完特定任務(wù)后麻捻,轉(zhuǎn)到另1個(gè)線程繼續(xù)執(zhí)行任務(wù)
03 線程間通信方式 – 利用NSPort(沒(méi)有講,知道即可呀袱,暫不用深究)
-(void)touchesBegan:(nonnull NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event
{
    //開(kāi)啟一條子線程來(lái)下載圖片
    [NSThread detachNewThreadSelector:@selector(downloadImage) toTarget:self withObject:nil];
}

-(void)downloadImage
{
    //1.確定要下載網(wǎng)絡(luò)圖片的url地址贸毕,一個(gè)url唯一對(duì)應(yīng)著網(wǎng)絡(luò)上的一個(gè)資源
    NSURL *url = [NSURL URLWithString:@"http://p6.qhimg.com/t01d2954e2799c461ab.jpg"];

    //2.根據(jù)url地址下載圖片數(shù)據(jù)到本地(二進(jìn)制數(shù)據(jù)
    NSData *data = [NSData dataWithContentsOfURL:url];

    //3.把下載到本地的二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成圖片
    UIImage *image = [UIImage imageWithData:data];

    //4.回到主線程刷新UI
    //4.1 第一種方式
    /*
     第一個(gè)參數(shù):要調(diào)用的方法名稱
     第二個(gè)參數(shù):方法要接受的參數(shù)
     第三個(gè)參數(shù):要不要等待,YES表示等待,NO不等待
     */
//    [self performSelectorOnMainThread:@selector(showImage:) withObject:image waitUntilDone:YES];

    //4.2 第二種方式(簡(jiǎn)便方法)
    //setImage:是imageView自身的方法
//    [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];

    //4.3 第三種方式
    [self.imageView performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES];
}

    //4.4-4.5 第四、五種方式 與循環(huán)有關(guān)的方式
//    [self.imageView performSelectorOnMainThread:<#(nonnull SEL)#> withObject:<#(nullable id)#> waitUntilDone:<#(BOOL)#> modes:<#(nullable NSArray<NSString *> *)#>]

//    [self.imageView performSelector:<#(nonnull SEL)#> onThread:<#(nonnull NSThread *)#> withObject:<#(nullable id)#> waitUntilDone:<#(BOOL)#> modes:<#(nullable NSArray<NSString *> *)#>];

//      [self.imageView performSelector:@selector(setImage:) withObject:[UIImage imageNamed:@"Snip20151105_143"] afterDelay:2.0 inModes:@[NSDefaultRunLoopMode,UITrackingRunLoopMode]];

(6)如何計(jì)算代碼段的執(zhí)行時(shí)間

//第一種方法
    NSDate *start = [NSDate date];
    //2.根據(jù)url地址下載圖片數(shù)據(jù)到本地(二進(jìn)制數(shù)據(jù))
    NSData *data = [NSData dataWithContentsOfURL:url];

    NSDate *end = [NSDate date];
    NSLog(@"第二步操作花費(fèi)的時(shí)間為%f",[end timeIntervalSinceDate:start]);

//第二種方法
    //獲取啟動(dòng)時(shí)間
    CFTimeInterval start = CFAbsoluteTimeGetCurrent();
    NSData *data = [NSData dataWithContentsOfURL:url];

    //獲取結(jié)束時(shí)間
    CFTimeInterval end = CFAbsoluteTimeGetCurrent();
    //打印用時(shí)
    NSLog(@"第二步操作花費(fèi)的時(shí)間為%f",end - start);//獲取的時(shí)間都是絕對(duì)時(shí)間夜赵,可以直接相減

(7)主線程其他相關(guān)用法(可直接查閱文檔)

+ (NSThread *)mainThread; // 獲得主線程
+ (NSThread *)currentThread;//獲得當(dāng)前線程
+ (BOOL)isMultiThreaded;//判斷是否是多線程
+ (BOOL)isMainThread; // 判斷是否為主線程
- (BOOL)isMainThread; // 判斷是否為主線程

//獲取線程的可變字典明棍,只讀
thread.threadDictionary

//判斷線程狀態(tài)
//是否執(zhí)行
@property (readonly, getter=isExecuting) BOOL executing NS_AVAILABLE(10_5, 2_0);
//是否完成
@property (readonly, getter=isFinished) BOOL finished NS_AVAILABLE(10_5, 2_0);
//是否取消
@property (readonly, getter=isCancelled) BOOL cancelled NS_AVAILABLE(10_5, 2_0);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市寇僧,隨后出現(xiàn)的幾起案子摊腋,更是在濱河造成了極大的恐慌,老刑警劉巖嘁傀,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兴蒸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡细办,警方通過(guò)查閱死者的電腦和手機(jī)橙凳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人痕惋,你說(shuō)我怎么就攤上這事区宇。” “怎么了值戳?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵议谷,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我堕虹,道長(zhǎng)卧晓,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任赴捞,我火速辦了婚禮逼裆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赦政。我一直安慰自己胜宇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布恢着。 她就那樣靜靜地躺著桐愉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪掰派。 梳的紋絲不亂的頭發(fā)上从诲,一...
    開(kāi)封第一講書(shū)人閱讀 52,246評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音靡羡,去河邊找鬼系洛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛略步,可吹牛的內(nèi)容都是我干的描扯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼纳像,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼荆烈!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起竟趾,我...
    開(kāi)封第一講書(shū)人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宫峦,沒(méi)想到半個(gè)月后岔帽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡导绷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年犀勒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贾费,死狀恐怖钦购,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情褂萧,我是刑警寧澤押桃,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站导犹,受9級(jí)特大地震影響唱凯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谎痢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一磕昼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧节猿,春花似錦票从、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至九孩,卻和暖如春先馆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背躺彬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工煤墙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宪拥。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓仿野,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親她君。 傳聞我的和親對(duì)象是個(gè)殘疾皇子脚作,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

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

  • 本文選譯自《Threading Programming Guide》。 導(dǎo)語(yǔ) 線程技術(shù)作為在單個(gè)應(yīng)用程序中并發(fā)執(zhí)行...
    巧巧的二表哥閱讀 2,439評(píng)論 4 24
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,359評(píng)論 0 35
  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,160評(píng)論 30 470
  • 盼望已久的電影芳華終于在昨天看到了缔刹,當(dāng)初知道預(yù)定的十一檔期臨時(shí)改檔時(shí)球涛,失落好久。 對(duì)于這部影片的期待校镐,不...
    田園小翠兒閱讀 360評(píng)論 1 4
  • 杰克倫敦說(shuō)亿扁,人應(yīng)該生活,而不僅僅是生存鸟廓。李漁說(shuō)从祝,名乎利乎道路奔波腸碌碌襟己,來(lái)者往者溪山清靜且停停。沒(méi)有恰當(dāng)?shù)膶徝离鼓埃?..
    馮唐第二閱讀 228評(píng)論 0 0