IOS多線程知識總結/隊列概念/GCD/串列/並行/同步/非同步

来源:http://www.cnblogs.com/hrios/archive/2016/06/22/thr.html
-Advertisement-
Play Games

進程:正在進行中的程式被稱為進程,負責程式運行的記憶體分配;每一個進程都有自己獨立的虛擬記憶體空間; 線程:線程是進程中一個獨立的執行路徑(控制單元);一個進程中至少包含一條線程,即主線程。 隊列:dispatch_queue_t,一種先進先出的數據結構,線程的創建和回收不需要程式員操作,由隊列負責。 ...


進程:正在進行中的程式被稱為進程,負責程式運行的記憶體分配;每一個進程都有自己獨立的虛擬記憶體空間;

線程:線程是進程中一個獨立的執行路徑(控制單元);一個進程中至少包含一條線程,即主線程。

隊列dispatch_queue_t,一種先進先出的數據結構,線程的創建和回收不需要程式員操作,由隊列負責。

  串列隊列:隊列中的任務只會順序執行(類似跑步)

      dispatch_queue_t q = dispatch_queue_create(“....”, dispatch_queue_serial);

  並行隊列:隊列中的任務通常會併發執行(類似賽跑)

        dispatch_queue_t q = dispatch_queue_create("......", dispatch_queue_concurrent);

  全局隊列:是系統開發的,直接拿過來(get)用就可以;與並行隊列類似,但調試時,無法確認操作所在隊列

        dispatch_queue_t q = dispatch_get_global_queue(dispatch_queue_priority_default, 0);

  主隊列:每一個應用程式對應唯一一個主隊列,直接get即可;在多線程開發中,使用主隊列更新UI

      dispatch_queue_t q = dispatch_get_main_queue();

操作

   dispatch_async 非同步操作,會併發執行,無法確定任務的執行順序;

   dispatch_sync 同步操作,會依次順序執行,能夠決定任務的執行順序;

 

串列隊列同步:操作不會新建線程、操作順序執行;

串列隊列非同步:操作需要一個子線程,會新建線程、線程的創建和回收不需要程式員參與,操作順序執行,是最安全的選擇;

 

並行隊列同步:操作不會新建線程、操作順序執行;

並行隊列非同步:操作會新建多個線程(有多少任務,就開n個線程執行)、操作無序執行;隊列前如果有其他任務,會等待前面的任務完成之後再執行;場景:既不影響主線程,又不需要

順序執行的操作!

 

全局隊列非同步:操作會新建多個線程、操作無序執行,隊列前如果有其他任務,會等待前面的任務完成之後再執行;

全局隊列同步:操作不會新建線程、操作順序執行;

 

主隊列非同步:操作都應該在主線程上順序執行的,不存在非同步的;

主隊列同步:如果把主線程中的操作看成一個大的block,那麼除非主線程被用戶殺掉,否則永遠不會結束;主隊列中添加的同步操作永遠不會被執行,會死鎖

 

不同隊列嵌套dispathch_sync(同步)任務的結果

 // 1.全局隊列,都在主線程上執行,不會死鎖 dispatch_queue_priority_default

 dispatch_queue_t q = dispatch_get_global_queue(dispatch_queue_priority_default, 0);

 // 2.並行隊列,都在主線程上執行,不會死鎖 dispatch_queue_concurrent

 dispatch_queue_t q = dispatch_queue_create("cn.itcast.gcddemo", dispatch_queue_concurrent);

 // 3.串列隊列,會死鎖,但是會執行嵌套同步操作之前的代碼 dispatch_queue_serial

 dispatch_queue_t q = dispatch_queue_create("cn.itcast.gcddemo", dispatch_queue_serial);

 // 4.主隊列,直接死鎖 dispatch_get_main_queue();

 dispatch_queue_t q = dispatch_get_main_queue();

 

dispatch_sync同步應用開發場景

阻塞並行隊列的執行,要求某一操作執行後再進行後續操作,如用戶登錄

確保塊代碼之外的局部變數確實被修改

dispatch_queue_t q = dispatch_queue_create("cn.itcast.gcddemo", dispatch_queue_concurrent);

__block bool login = no;

dispatch_sync(q, ^{

nslog(@"模擬耗時操作 %@", [nsthread currentthread]);

[nsthread sleepfortimeinterval:2.0f];

nslog(@"模擬耗時完成 %@", [nsthread currentthread]);

login = yes; 

 });

dispatch_async(q, ^{

nslog(@"登錄完成的處理 %@", [nsthread currentthread]);

});

ios三種多線程技術

   1.nsthread

     (1)使用nsthread對象建立一個線程非常方便

     (2)但是!要使用nsthread管理多個線程非常困難,不推薦使用

     (3)技巧!使用[nsthread currentthread]跟蹤任務所線上程,適用於這三種技術

   2.nsoperation/nsoperationqueue

     (1)是使用gcd實現的一套objective-c的api

     (2)是面向對象的線程技術

     (3)提供了一些在gcd中不容易實現的特性,如:限制最大併發數量、操作之間的依賴關係

   3.gcd —— grand central dispatch

     (1)是基於c語言的底層api

     (2)用block定義任務,使用起來非常靈活便捷

     (3)提供了更多的控制能力以及操作隊列中所不能使用的底層函數

 

1---- 隊列和線程的區別:

隊列:是管理線程的,相當於線程池,能管理線程什麼時候執行。

隊列分為串列隊列和並行隊列:

串列隊列:隊列中的線程按順序執行(不會同時執行)

並行隊列:隊列中的線程會併發執行,可能會有一個疑問,隊列不是先進先出嗎,如果後面的任務執行完了,怎麼出去的了。這裡需要強調下,任務執行完畢了,不一定出隊列。只有前面的任務執行完了,才會出隊列。

2----- 主線程隊列和gcd創建的隊列也是有區別的。

主線程隊列和gcd創建的隊列是不同的。在gcd中創建的隊列優先順序沒有主隊列高,所以在gcd中的串列隊列開啟同步任務裡面沒有嵌套任務是不會阻塞主線程,只有一種可能導致死鎖,就是串列隊列里,嵌套開啟任務,有可能會導致死鎖。

主線程隊列中不能開啟同步,會阻塞主線程。只能開啟非同步任務,開啟非同步任務也不會開啟新的線程,只是降低非同步任務的優先順序,讓cpu空閑的時候才去調用。而同步任務,會搶占主線程的資源,會造成死鎖。

3----- 線程:裡面有非常多的任務(同步,非同步)

同步與非同步的區別:

同步任務優先順序高,線上程中有執行順序,不會開啟新的線程。 

非同步任務優先順序低,線上程中執行沒有順序,看cpu閑不閑。在主隊列中不會開啟新的線程,其他隊列會開啟新的線程。

4----主線程隊列註意: 

 在主隊列開啟非同步任務,不會開啟新的線程而是依然在主線程中執行代碼塊中的代碼。為什麼不會阻塞線程?

 > 主隊列開啟非同步任務,雖然不會開啟新的線程,但是他會把非同步任務降低優先順序,等閑著的時候,就會在主線程上執行非同步任務。

 在主隊列開啟同步任務,為什麼會阻塞線程?

 > 在主隊列開啟同步任務,因為主隊列是串列隊列,裡面的線程是有順序的,先執行完一個線程才執行下一個線程,而主隊列始終就只有一個主線程,主線程是不會執行完畢的,因為他是無限迴圈的,除非關閉應用開發程式。因此在主線程開啟一個同步任務,同步任務會想搶占執行的資源,而主線程任務一直在執行某些操作,不肯放手。兩個的優先順序都很高,最終導致死鎖,阻塞線程了。

參考:http://www.makaidong.com/博客園熱/32951.shtml


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這麼多行的代碼其實可以縮寫為一句: 註意: 1、使用這一簡寫方式你至少要指定 font-size 和 font-family 屬性,其他的屬性(如 font-weight、font-style、font-varient、line-height)如未指定將自動使用預設值。 2、在縮寫時 font-si ...
  • 有一個有趣的現象就是當為元素(不論之前是什麼類型元素,display:none 除外)設置以下 2 個句之一: position : absolutefloat : left 或 float:right元素會自動變為以 display:inline-block 的方式顯示,當然就可以設置元素的 wi ...
  • !important: 為某些樣式設置具有最高權值,高於id選擇器 用法: !important要寫在分號的前面 例如: 效果: !important的效果 到了三年級下學期時,我們班上了一節公開課,老師提出了一個很 效果: !important的效果 到了三年級下學期時,我們班上了一節公開課,老師 ...
  • 今天在網易雲的網頁版聽歌,話說Steve Vai的曲子永遠是這麼讓人揣摩不透,不過我還時更喜歡老Joe,咦,跑題了··· 大家可以看到評論輸入框和回覆框,上面都有個小尖角,實現的方式有很多,我一般是用border來做,只要給一個元素加上這四條屬性就行了: 下麵要講的是網易雲上面的黑科技,我看完真的是 ...
  • 打開Genymotion運行虛擬機提示如下錯誤: The Genymotion Virtual device could not obtain an IP address.For an unknown reason, VirtualBox DHCP has not assigned an IP ad ...
  • 打開Android Studio,依次【File】-【Settings】 在打開的settings界面里找到plugins設置項,點擊右側的“Browser。。”按鈕 在搜索欄里輸入genymotion關鍵字,可以看到右側已經搜索到插件,點擊install安裝。 開始下載,速度很快。安裝後重新啟動A ...
  • 移除對舊設備的支持 影響:可重新生成;再連接舊設備調試時,會重新自動生成。 路徑: 如果你不是在wb145230博客園看到本文,請點擊查看原文. ...
  • 一,效果圖。 二,工程圖。 三,代碼。 RootViewController.h #import <UIKit/UIKit.h> @class BECheckBox; @interface RootViewController : UIViewController { BECheckBox *pas ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...