標籤:
前言
線程是用來執行任務的,線程徹底執行完任務A才能去執行任務B。為了同時執行兩個任務,產生了多線程。
就我們日常生活的例子來說:
(1)我開啟一個視頻軟體,我開闢一個線程A讓它執行下載任務,我開闢一個線程B,用來播放視頻。我開闢兩個線程後,這兩個任務能同時執行,如果我開闢一個線程,只有下載任務完成,才能去執行播放任務。
(2)線程相當於店裡的服務員,一個服務員同時只能做一件事情,多顧幾個服務員,就能同時做很多事情。
在瞭解多線程之前我們先來介紹一下進程和線程
進程
進程是作業系統中啟動並執行程式專業的講,應用程式的執行執行個體不能執行任務進程在運行時候建立的資源隨著進程的終止而死亡進程裡面可以包含多個線程
線程
線程是進程內部的一個獨立的執行單元一個線程同時只能執行一個任務包含主線程(使用介面執行緒)和子線程(背景工作執行緒或後台線程)線程執行完畢就會銷毀
主線程:當應用程式啟動時自動建立和啟動,通常用來處理使用者的輸入並響應各種事件和訊息主線程的終止意味著該程式的結束
子線程:有主線程來建立,用來協助主線程執行程式的幕後處理任務,如果子線程A中建立了一個子線程B,在建立之後兩者是相互獨立的,多個子線程之間效果上是可以同時執行
線程狀態:五種線程狀態 點擊開啟連結
多線程
(1) 目前大多數的app,都需要串連伺服器,而訪問伺服器的速度可能快也可能很慢。如果一個app訪問伺服器的操作沒有在子線程操作的話,在該app訪問伺服器的過程中,該軟體是不能響應使用者的操作的,只有該app訪問結束以後,app才能響應使用者的操作,這就造成線程阻塞,也就是我們常見的卡頓現象。一條線程在同一時間內只能執行一個任務,但是進程可以有多條線程。可以開啟多條線程來執行不同的任務,從而提高程式的執行效率,避免線程阻塞。
(2) 每個線程都可以設定優先權,作業系統會根據線程的優先順序來安排CPU的時間,優先順序高的線程,優先調用的幾率會更大,同級的話,執行的先後對線程執行的先後有影響
(3)同一時間內,CPU只能處理一條線程,只有一條線程在工作。多線程並存執行,其實就是各個線程不斷切換,因為執行切換的時間很快很快,就造成了同時執行的假象,原理如下,比如A,B兩個線程;
①A執行到某一時間段要切換了,可A任務沒完成,系統就會把A當前執行的位置和資料以入棧的方式儲存起來
②然後B線程執行,B執行時間到了,它的位置狀態等也會被系統儲存到B的棧中。
③系統自動找到A的棧,將A之前儲存的資料恢複,又可以從A之前斷開的狀態繼續執行下去,如此迴圈
(4)系統每開一個線程都有比較大的開銷,若線程開的過多,不僅會佔用大量記憶體和讓城鄉變得更加複雜,而且會加重CPU的負擔,這樣的軟體,會讓你省掉冬天買暖手寶的錢。
多線程優勢
(1)提高程式執行效率,避免線程阻塞造成的卡頓現象
(2)能適當提高資源使用率(CPU,記憶體)
多線程的不足
(1)開啟線程需要佔用一定的記憶體空間
(2)線程越多,CPU線上程調度上的開銷就越大
(3)程式設計更加複雜:比如線程之間的通訊、多線程的資料共用
總結
線程與進程的關係
線程是CPU執行任務的基本單位,一個進程可以有多個線程,但同時只能執行一個任務。
進程就是運行中的軟體,是動態。
一個作業系統可以對應多個進程,一個進程可以有多條線程,但至少有一個線程
同一個進程內的線程共用進程裡的資源
主線程
進程一啟動就自動建立
顯示和重新整理UI介面
處理UI事件
子線程的作用
處理耗時的操作
子線程不能用來重新整理UI
三種多線程編程技術
1. NSThread NSThread是輕量級的多線程開發,使用並不複雜,但使用NSThread需要自己管理線程的聲明周期。
2. Cocoa NSOperation
使用NSOperation和NSOperationQueue進行多線程開發類似於線程池,只要將一個NSOperation(實際開發中需要使用其子類NSInvocationOperation、NSBlockOperation)放到NSOperationQueue這個隊列中線程就會依次啟動。NSOperationQueue負責管理、執行所有的NSOperation,在這個過程中可以更加容易管理線程總數和控制線程之間的依賴關係。
NSOperation有兩常用子類用於建立線程操作:NSInvocationOperation和NSBlockOperation,兩種方式本質沒有區別,但後者使用block形式進行程式碼群組織,使用相對方便。
3. GCD(Grand Central Dispatch) GCD是基於C語言開發的一套多線程開發機制,也是目前蘋果官網推薦的多線程開發方法。
GCD會自動管理線程的生命週期(建立線程、調度任務、銷毀線程),程式員只需要告訴GCD想要執行什麼任務,不需要編寫任何線程管理代碼
GCD是這三種多線程開發方式中抽象層次最高的,使用起來也是最為方便的,只是基於C語言開發,並不像前兩種是物件導向開發,而是完全面向過程的。這種機制相比較於前面兩種多線程開發方式最顯著的優點就是它對於多核運算更加有效,會自動利用更多的CPU核心(比如雙核、四核)。
GCD中也有一個類似於NSOperationQueue的隊列,GCD統一管理整個隊列中的任務。但是GCD中的隊列分為並行隊列和串列隊列兩類:
1、串列隊列:只有一個線程,加入到隊列中的操作按添加順序依次執行。
2、並發隊列:有多個線程,操作進來以後他會將這些線程安排在可用的處理器上,同時保證先進來的任務優先處理。
其實在GCD中還有一個特殊隊列就是主隊列,用來執行主線程上的操作任務。
iOS開發多線程理論介紹