多線程-NSThread

多線程學(xué)習(xí)筆記 - NSThread

NSThread的集中創(chuàng)建方法

1.方法一: NSThread對(duì)象創(chuàng)建 需要手動(dòng)開(kāi)啟線程

// 線程創(chuàng)建
NSThread * thread = [[NSThread alloc] initWithTarget:self selector:@selector(test_1) object:@"對(duì)象線程方法"];
// 開(kāi)啟線程
[thread start]; 

// 方法
- (void) test_1
{
    NSLog(@"test_1 - %@",[NSThread currentThread]);
   //NSThread練習(xí)[1608:289527] test_1 - <NSThread: 0x600000262c40>{number = 3, name = (null)}
}

2.方法二: 分離子線程, 會(huì)自動(dòng)啟動(dòng)線程

// 線程創(chuàng)建
[NSThread detachNewThreadSelector:@selector(test_2) toTarget:self withObject:@"分離線程"];

// 方法
- (void) test_2
{
    NSLog(@"test_2 - %@",[NSThread currentThread]);
    //NSThread練習(xí)[1608:289528] test_2 - <NSThread: 0x600000263640>{number = 4, name = (null)}
}

3.方法三: 開(kāi)啟一條后臺(tái)線程, 也會(huì)自動(dòng)啟動(dòng)線程

// 線程創(chuàng)建
[self performSelectorInBackground:@selector(test_3) withObject:@"后臺(tái)程序"];

// 方法
- (void) test_3
{
    NSLog(@"test_3 - %@",[NSThread currentThread]);
    //2017-06-22 13:55:50.292 NSThread練習(xí)[1608:289529] test_3 - <NSThread: 0x600000263800>{number = 5, name = (null)}
}

方法對(duì)比

方法一
  • 優(yōu)點(diǎn): 可以拿到線程對(duì)象, 并設(shè)置相關(guān)屬性
  • 缺點(diǎn): 代碼量相對(duì)多一點(diǎn), 需要手動(dòng)啟動(dòng)線程
方法二和方法三
  • 優(yōu)點(diǎn): 創(chuàng)建線程簡(jiǎn)單快捷
  • 缺點(diǎn): 無(wú)法拿到線程對(duì)象, 無(wú)法設(shè)置相關(guān)屬性

NSThread的線程名字name與優(yōu)先級(jí)threadPriority

threadPriority 的取值范圍是 0.0 -- 1.0, 默認(rèn)是0.5. 數(shù)值越大, 優(yōu)先級(jí)越高 ,優(yōu)先級(jí)越高鹿蜀,處理器先處理這個(gè)線程的概率越大衩匣。

給線程添加名字與優(yōu)先級(jí)

NSThread * thread_1 = [[NSThread alloc] initWithTarget:self selector:@selector(compareTest) object:nil];
thread_1.name = @"線程——1"; // 線程名字
thread_1.threadPriority = 0.1; // 線程優(yōu)先級(jí)
[thread_1 start];

NSThread * thread_2 = [[NSThread alloc] initWithTarget:self selector:@selector(compareTest) object:nil];
thread_2.name = @"線程——2";
thread_2.threadPriority = 0.5;
[thread_2 start];
    
NSThread * thread_3 = [[NSThread alloc] initWithTarget:self selector:@selector(compareTest) object:nil];
thread_3.name = @"線程——3";
thread_3.threadPriority = 1.0;
[thread_3 start];

打印出線程的名字與順序分別是

// 優(yōu)先級(jí)高的線程先執(zhí)行
2017-06-22 14:19:00.461 NSThread練習(xí)[1690:379110] 當(dāng)前線程名字 - 線程——3
2017-06-22 14:19:00.461 NSThread練習(xí)[1690:379109] 當(dāng)前線程名字 - 線程——2
2017-06-22 14:19:00.461 NSThread練習(xí)[1690:379108] 當(dāng)前線程名字 - 線程——1

控制線程

- (void)start; // 開(kāi)啟線程
+ (void)exit; // 結(jié)束線程 
// 阻塞(或休眠)線程
+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;

線程一旦進(jìn)入到死亡狀態(tài), 線程也就停止了, 就不能再次啟動(dòng)任務(wù).


線程安全

1.一塊資源可能會(huì)被多個(gè)線程共享, 也就是多個(gè)線程可能會(huì)訪問(wèn)同一塊資源
2.比如多個(gè)線程訪問(wèn)同一個(gè)對(duì)象, 同一個(gè)變量, 同一個(gè)文件

3.當(dāng)多個(gè)線程訪問(wèn)同一塊資源時(shí), 很容易引發(fā)數(shù)據(jù)錯(cuò)亂和數(shù)據(jù)安全問(wèn)題

賣票的多線程問(wèn)題(多線程共享一塊資源)

  • 創(chuàng)建不同線程與票總數(shù)
    // 總共100張票
    self.ticketCount = 100;
    
    NSThread * thread_A = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
    NSThread * thread_B = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
    NSThread * thread_C = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
    
    thread_A.name = @"售票員A";
    thread_B.name = @"售票員B";
    thread_C.name = @"售票員C";
    
    [thread_A start];
    [thread_B start];
    [thread_C start];
  • 不使用線程鎖的方法
// 賣票
- (void) saleTicket
{
    while (1) {
        NSInteger count = self.ticketCount;
        if (count > 0)
        {
            for (int i = 0; i < 1000000; ++i)
            {
                // 只是耗時(shí)間, 沒(méi)有其他用
            }
            self.ticketCount = count - 1;
            NSLog(@"%@賣出一張票,還剩- %ld", [NSThread currentThread].name, (long)self.ticketCount);
        } else {
            NSLog(@"票賣完了");
            break;
        }
    }
}
可以看出最后的票賣的很混亂
2017-06-22 15:15:55.212 NSThread練習(xí)[1968:555811] 售票員C賣出一張票,還剩- 2
2017-06-22 15:15:55.213 NSThread練習(xí)[1968:555810] 售票員B賣出一張票,還剩- 4
2017-06-22 15:15:55.214 NSThread練習(xí)[1968:555809] 售票員A賣出一張票,還剩- 2
2017-06-22 15:15:55.216 NSThread練習(xí)[1968:555811] 售票員C賣出一張票,還剩- 1
2017-06-22 15:15:55.217 NSThread練習(xí)[1968:555810] 售票員B賣出一張票,還剩- 3
2017-06-22 15:15:55.218 NSThread練習(xí)[1968:555809] 售票員A賣出一張票,還剩- 1
2017-06-22 15:15:55.221 NSThread練習(xí)[1968:555811] 售票員C賣出一張票,還剩- 0
2017-06-22 15:15:55.221 NSThread練習(xí)[1968:555811] 票賣完了
2017-06-22 15:15:55.222 NSThread練習(xí)[1968:555809] 售票員A賣出一張票,還剩- 0
2017-06-22 15:15:55.222 NSThread練習(xí)[1968:555809] 票賣完了
2017-06-22 15:15:55.223 NSThread練習(xí)[1968:555810] 售票員B賣出一張票,還剩- 2
2017-06-22 15:15:55.226 NSThread練習(xí)[1968:555810] 售票員B賣出一張票,還剩- 1
2017-06-22 15:15:55.229 NSThread練習(xí)[1968:555810] 售票員B賣出一張票,還剩- 0
2017-06-22 15:15:55.230 NSThread練習(xí)[1968:555810] 票賣完了
  • 使用線程鎖保證線程安全
// 賣票
- (void) saleTicket
{
    while (1) {
        // 加 互斥鎖, 全局唯一, self, 代表鎖對(duì)象
        @synchronized(self)
        {
            NSInteger count = self.ticketCount;
            if (count > 0)
            {
                self.ticketCount = count - 1;
                NSLog(@"%@賣出一張票,還剩- %ld", [NSThread currentThread].name, (long)self.ticketCount);
            } else {
                NSLog(@"票賣完了");
                break;
            }
        }
    }
}
//不會(huì)出現(xiàn)數(shù)據(jù)混亂的情況了, 也達(dá)到了三個(gè)線程賣票的功能.
2017-06-22 15:24:00.116 NSThread練習(xí)[1995:594897] 售票員A賣出一張票,還剩- 5
2017-06-22 15:24:00.117 NSThread練習(xí)[1995:594899] 售票員C賣出一張票,還剩- 4
2017-06-22 15:24:00.117 NSThread練習(xí)[1995:594898] 售票員B賣出一張票,還剩- 3
2017-06-22 15:24:00.117 NSThread練習(xí)[1995:594897] 售票員A賣出一張票,還剩- 2
2017-06-22 15:24:00.117 NSThread練習(xí)[1995:594899] 售票員C賣出一張票,還剩- 1
2017-06-22 15:24:00.118 NSThread練習(xí)[1995:594898] 售票員B賣出一張票,還剩- 0
2017-06-22 15:24:00.119 NSThread練習(xí)[1995:594897] 票賣完了
2017-06-22 15:24:00.119 NSThread練習(xí)[1995:594899] 票賣完了
2017-06-22 15:24:00.120 NSThread練習(xí)[1995:594898] 票賣完了

學(xué)習(xí)文獻(xiàn)-iOS多線程實(shí)現(xiàn)方案之 -- NSThread

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末判导,一起剝皮案震驚了整個(gè)濱河市爬立,隨后出現(xiàn)的幾起案子啃洋,更是在濱河造成了極大的恐慌,老刑警劉巖凳干,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锐帜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡拍冠,警方通過(guò)查閱死者的電腦和手機(jī)尿这,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)倦微,“玉大人妻味,你說(shuō)我怎么就攤上這事⌒栏#” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵焦履,是天一觀的道長(zhǎng)拓劝。 經(jīng)常有香客問(wèn)我,道長(zhǎng)嘉裤,這世上最難降的妖魔是什么郑临? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮屑宠,結(jié)果婚禮上厢洞,老公的妹妹穿的比我還像新娘。我一直安慰自己典奉,他們只是感情好躺翻,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著卫玖,像睡著了一般公你。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上假瞬,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天陕靠,我揣著相機(jī)與錄音迂尝,去河邊找鬼。 笑死剪芥,一個(gè)胖子當(dāng)著我的面吹牛垄开,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播税肪,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼说榆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了寸认?” 一聲冷哼從身側(cè)響起签财,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎偏塞,沒(méi)想到半個(gè)月后唱蒸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡灸叼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年神汹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片古今。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屁魏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捉腥,到底是詐尸還是另有隱情氓拼,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布抵碟,位于F島的核電站桃漾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拟逮。R本人自食惡果不足惜撬统,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望敦迄。 院中可真熱鬧恋追,春花似錦、人聲如沸罚屋。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)沿后。三九已至沿彭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尖滚,已是汗流浹背喉刘。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工瞧柔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人睦裳。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓造锅,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親廉邑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哥蔚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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

  • 一牵祟、多線程簡(jiǎn)介: 所謂多線程是指一個(gè) 進(jìn)程 -- process(可以理解為系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序)中可以開(kāi)...
    尋形覓影閱讀 1,017評(píng)論 0 6
  • 創(chuàng)建和啟動(dòng)線程 一個(gè)NSThread對(duì)象就代表一條線程 創(chuàng)建深夯、啟動(dòng)線程 NSThread *thread = [[...
    JonesCxy閱讀 215評(píng)論 0 0
  • 多線程是程序開(kāi)發(fā)中非常基礎(chǔ)的一個(gè)概念诺苹,大家在開(kāi)發(fā)過(guò)程中應(yīng)該或多或少用過(guò)相關(guān)的東西咕晋。同時(shí)這恰恰又是一個(gè)比較棘手的概念...
    小笨狼閱讀 4,695評(píng)論 14 61
  • 只是一起走過(guò)一段路而已,何必把懷念弄的比經(jīng)過(guò)還長(zhǎng)收奔。
    雋雋彥閱讀 68評(píng)論 0 0
  • 丈夫因?yàn)楣ぷ魃系睦Ь扯蠲疾徽拐莆兀拮訒?huì)及時(shí)發(fā)現(xiàn)他的狀態(tài),然后主動(dòng)去詢問(wèn)坪哄,他們將一起面對(duì)這個(gè)困境质蕉,丈夫在這個(gè)過(guò)程中感...
    清水微甜的日常閱讀 141評(píng)論 0 0