多線程簡介(一)

在開發(fā)中只要涉及到性能調(diào)優(yōu),多線程是避不開的話題,之前也一直在用,不過沒有系統(tǒng)的整理一遍,這段時間利用快過年了也不是很忙,整理了一下多線程的知識,從網(wǎng)上找的視頻看了一遍,就當是記錄一下了。

概念

進程:系統(tǒng)中正在運行的一個應(yīng)用程序,進程中只有有一個線程

線程:一個進程要執(zhí)行任務(wù),必須有線程,進程的所有任務(wù)都是在線程中進行的

線程的串行:一個線程中的任務(wù)執(zhí)行都是串行的,在一個線程中執(zhí)行多個任務(wù),只能一個一個的按順序執(zhí)行,并且同一時間,一個線程只能執(zhí)行一個任務(wù)

多線程:一個進程可以開啟多個線程,每個線程可以并行(同時)執(zhí)行不同的任務(wù),多線程可以提高程序的執(zhí)行效率

多線程原理:同一時間CPU只能處理1個線程,只有一個線程在工作(執(zhí)行),多線程并發(fā)執(zhí)行,其實是CPU快速的在多條線程之間調(diào)度(切換),這樣CPU調(diào)度線程的時間足夠快,就造成了多線程并發(fā)執(zhí)行的假象

image

多線程的優(yōu)點:能適度的提高程序的執(zhí)行效率,能適度的提高資源的利用率(CPU、內(nèi)存利用率)

多線程的缺點:創(chuàng)建線程是有開銷的,iOS下主要成本包括:內(nèi)核數(shù)據(jù)結(jié)構(gòu)、??臻g、創(chuàng)建時間。所以如果開啟大量線程,會降低程序性能,線程越多,CPU在調(diào)度線程上的開銷就越大,還會增加程序設(shè)計的復(fù)雜性,要合理的開啟線程。

多線程在iOS開發(fā)中的應(yīng)用

主線程:iOS程序在運行后,會默認開啟一條線程,稱為“主線程”或“UI線程”,主線程的主要作用是:顯示/刷新UI界面,處理事件(點擊事件、滑動事件、拖拽事件等),界面UI的處理都需要在主線程中進行,否則會沒有效果。但是比較耗時的操作不要放到主線程中,否則會卡住主線程,嚴重影響UI的流暢度,給用戶一種“卡”的體驗。

多線程的實現(xiàn)方案
技術(shù)方案 簡介 語言 線程生命周期 使用頻率
NSThread 面向?qū)ο螅唵我子?,可直接操作線程對象 OC 程序員管理 偶爾使用
GCD 蘋果替代NSThread的線程技術(shù),充分利用設(shè)備的多核 C 自動管理 經(jīng)常使用
NSOperation 基于GCD,比GCD多了一些簡單實用的功能,更加的面向?qū)ο?/td> OC 自動管理 經(jīng)常使用
@synchronized(self)的用法:

@synchronized

@synchronized 的作用是創(chuàng)建一個互斥鎖,保證此時沒有其它線程對self對象進行修改。這個是objective-c的一個鎖定令牌,防止self對象在同一時間內(nèi)被其它線程訪問,起到線程的保護作用。

// 鎖定一段代碼,必須使用一把鎖對象,用多把鎖對象是無效的
@synchronized (self) {// self是鎖對象
    // 需要鎖定的代碼
    while (1) {
        NSInteger count = self.ticketCount;
        if (count > 0) {
            self.ticketCount = count - 1;
            NSLog(@"%@賣了一張,還剩下%zd張",[NSThread currentThread].name,self.ticketCount);    
        } else {
            NSLog(@"全部賣完了");
            break;
        }    
    }
}
/*
* 優(yōu)點:能防止多線程爭奪資源時造成的數(shù)據(jù)安全問題
* 缺點:需要消耗大量CPU資源
*/
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容