99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

Ios多線程知識總結(jié)

發(fā)布時間:2016-07-22 22:38  回復(fù):0  查看:2835   最后回復(fù):2016-07-22 22:38  

最近在學(xué)習(xí)ios多線程,總結(jié)了必學(xué)的一些知識點,希望加深自己的印象,也希望對大家有幫助。

進程:正在進行中的程序被稱為進程,負責(zé)程序運行的內(nèi)存分配;每一個進程都有自己獨立的虛擬內(nèi)存空間;

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

隊列:dispatch_queue_t,一種先進先出的數(shù)據(jù)結(jié)構(gòu),線程的創(chuàng)建和回收不需要程序員操作,由隊列負責(zé)。

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

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

并行隊列:隊列中的任務(wù)通常會并發(fā)執(zhí)行(類似賽跑)

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

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

    dispatch_queue_t q = dispatch_get_global_queue(dispatch_queue_priority_default, 0);

主隊列:每一個應(yīng)用程序?qū)?yīng)唯一一個主隊列,直接get即可;在多線程開發(fā)中,使用主隊列更新UI

dispatch_queue_t q = dispatch_get_main_queue();

操作

  dispatch_async 異步操作,會并發(fā)執(zhí)行,無法確定任務(wù)的執(zhí)行順序;

  dispatch_sync 同步操作,會依次順序執(zhí)行,能夠決定任務(wù)的執(zhí)行順序;

 

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

串行隊列異步:操作需要一個子線程,會新建線程、線程的創(chuàng)建和回收不需要程序員參與,操作順序執(zhí)行,是最安全的選擇;

 

并行隊列同步:操作不會新建線程、操作順序執(zhí)行;

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

順序執(zhí)行的操作!

 

全局隊列異步:操作會新建多個線程、操作無序執(zhí)行,隊列前如果有其他任務(wù),會等待前面的任務(wù)完成之后再執(zhí)行;

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

 

主隊列異步:操作都應(yīng)該在主線程上順序執(zhí)行的,不存在異步的;

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

 

不同隊列嵌套dispathch_sync(同步)任務(wù)的結(jié)果

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

 dispatch_queue_t q = dispatch_get_global_queue(dispatch_queue_priority_default, 0);

 // 2.并行隊列,都在主線程上執(zhí)行,不會死鎖 dispatch_queue_concurrent

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

 // 3.串行隊列,會死鎖,但是會執(zhí)行嵌套同步操作之前的代碼 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同步應(yīng)用開發(fā)場景

阻塞并行隊列的執(zhí)行,要求某一操作執(zhí)行后再進行后續(xù)操作,如用戶登錄

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

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三種多線程技術(shù):

  1.nsthread

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

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

  (3)技巧!使用[nsthread currentthread]跟蹤任務(wù)所在線程,適用于這三種技術(shù)

  2.nsoperation/nsoperationqueue

  (1)是使用gcd實現(xiàn)的一套objective-capi

  (2)面向?qū)ο?/a>的線程技術(shù)

  (3)提供了一些在gcd中不容易實現(xiàn)的特性,如:限制最大并發(fā)數(shù)量、操作之間的依賴關(guān)系

  3.gcd —— grand central dispatch

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

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

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

 

1---- 隊列和線程的區(qū)別:

隊列:是管理線程的,相當(dāng)于線程池,能管理線程什么時候執(zhí)行。

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

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

并行隊列:隊列中的線程會并發(fā)執(zhí)行,可能會有一個疑問,隊列不是先進先出嗎,如果后面的任務(wù)執(zhí)行完了,怎么出去的了。這里需要強調(diào)下,任務(wù)執(zhí)行完畢了,不一定出隊列。只有前面的任務(wù)執(zhí)行完了,才會出隊列。

2----- 主線程隊列和gcd創(chuàng)建的隊列也是有區(qū)別的。

主線程隊列和gcd創(chuàng)建的隊列是不同的。在gcd中創(chuàng)建的隊列優(yōu)先級沒有主隊列高,所以在gcd中的串行隊列開啟同步任務(wù)里面沒有嵌套任務(wù)是不會阻塞主線程,只有一種可能導(dǎo)致死鎖,就是串行隊列里,嵌套開啟任務(wù),有可能會導(dǎo)致死鎖。

主線程隊列中不能開啟同步,會阻塞主線程。只能開啟異步任務(wù),開啟異步任務(wù)也不會開啟新的線程,只是降低異步任務(wù)的優(yōu)先級,讓cpu空閑的時候才去調(diào)用。而同步任務(wù),會搶占主線程的資源,會造成死鎖。

3----- 線程:里面有非常多的任務(wù)(同步,異步)

同步與異步的區(qū)別:

同步任務(wù)優(yōu)先級高,在線程中有執(zhí)行順序,不會開啟新的線程。 

異步任務(wù)優(yōu)先級低,在線程中執(zhí)行沒有順序,看cpu閑不閑。在主隊列中不會開啟新的線程,其他隊列會開啟新的線程。

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

 在主隊列開啟異步任務(wù),不會開啟新的線程而是依然在主線程中執(zhí)行代碼塊中的代碼。為什么不會阻塞線程?

 > 主隊列開啟異步任務(wù),雖然不會開啟新的線程,但是他會把異步任務(wù)降低優(yōu)先級,等閑著的時候,就會在主線程上執(zhí)行異步任務(wù)。

 在主隊列開啟同步任務(wù),為什么會阻塞線程?

 > 在主隊列開啟同步任務(wù),因為主隊列是串行隊列,里面的線程是有順序的,先執(zhí)行完一個線程才執(zhí)行下一個線程,而主隊列始終就只有一個主線程,主線程是不會執(zhí)行完畢的,因為他是無限循環(huán)的,除非關(guān)閉應(yīng)用開發(fā)程序。因此在主線程開啟一個同步任務(wù),同步任務(wù)會想搶占執(zhí)行的資源,而主線程任務(wù)一直在執(zhí)行某些操作,不肯放手。兩個的優(yōu)先級都很高,最終導(dǎo)致死鎖,阻塞線程了。

 

 

 

原文來自:博客園/08號風(fēng)子

 

您還未登錄,請先登錄

熱門帖子

最新帖子

?