線程中ios
同步任務是串行隊列,也就是按順序執行。程序員
同步任務:不會開闢新的線程,它是在當前線程執行的。網絡
dispatch 調度 GCD裏面的函數都是以dispatch開頭的。併發
同步任務 步驟:異步
1.建立一個串行隊列 參數:1.隊列標籤 2.隊列屬性 DISPATCH_QUEUE_SERIAL它是個宏,是個NULLasync
dispatch_queue_t queue = dispatch_queue_create("ZPqueue",DISPATCH_QUEUE_SERIAL);函數
2.同步執行任務 通常只要使用同步執行,串行隊列對添加的同步任務,就會立刻執行。性能
dispatch_sync(queue,^{NSLog(@"%@",[NSThread currentThread]);});網站
異步執行:確定會開新線程,並且只會開一個線程,全部任務都會在這個新的線程裏面執行。spa
異步任務 步驟:
dispatch_queue_t queue = dispatch_queue_create("ZPasyncQueue",DISPATCH_QUEUE_SERIAL);
2.同步執行任務 通常只要使用同步執行,串行隊列對添加的同步任務,就會立刻執行。
dispatch_async(queue,^{NSLog(@"%@",[NSThread currentThread]);});
併發隊列:會開多個線程,而且它要開多少個線程是咱們沒法控制的。
dispatch_queue_t queue = dispatch_queue_create("ZPasyncQueue",DISPATCH_QUEUE_CONCURRENT);
2.同步執行任務 通常只要使用同步執行,串行隊列對添加的同步任務,就會立刻執行。
dispatch_async(queue,^{NSLog(@"%@",[NSThread currentThread]);});
總結:
核心概念:
任務:block
隊列:把任務放到隊列裏面,隊列遵循先進先出原則。
串行隊列:按順序執行,當前任務執行完畢纔會執行下一個目標任務。
併發隊列:同時執行多個任務(能夠同時去除多個任務,只要有線程)。
串行隊列同步執行:不開線程,在原來的線程裏面一個一個的按順序執行。
串行隊列異步執行:開一條線程,在新的線程裏面按順序執行。
併發隊列異步執行:開多個線程,併發執行(不必定是一個一個的執行,可能會是多個一塊兒執行)。
併發隊列同步執行:不開線程,在原來的線程裏面一個一個按順序執行。
階段性總結:
1.開不開線程,由執行任務方法決定,同步不開線程,異步確定開線程。
2.開多少線程,由隊列決定,串行最多開一個線程,併發能夠開多個線程。具體開多少個由GCD底層決定,程序員不能控制。
**主隊列**
// 主隊列 :專門負責在主線程上調度任務,不會再子線程調度任務,在主隊列不容許開新線程
// 主隊列:不容許開新線程
// 異步執行:會開新線程,在新線程執行。
// 結果:不卡線程,只能在主線程上面運行,順序執行。
步驟:
得到主隊列 --- 程序一旦啓動至少有一個主線程--->一開始就會建立主隊列
-(void)test1{
// 1.得到主隊列
dispatch_queue_t queue = dispatch_get_main_queue();
// 2.異步執行任務
for(int i = 0; i < 10; i++)
{
NSLog(@"調度前-----");
// 異步:把任務放到主隊列裏,可是不須要立刻執行。它跟for循環沒有關係,test1執行完畢以後他會所有執行完成。
dispatch_async(queue,^{
NSLog(@"%@ %d",[NSThread currnetThread],i);
});
}
NSLog(@"完成---"); // 在這裏執行完畢以後會執行主隊列的東西。
}
注意:異步執行:異步任務不須要立刻執行,只是先把任務放到主隊列,等線程有空再去執行,就是等到test1執行結束了,主線程有空閒了就去執行
**同步任務**
-(void)test2{
// 1.得到主隊列
dispatch_queue_t queue = dispatch_get_main_queue();
// 2.異步執行任務
for(int i = 0; i < 10; i++)
{
NSLog(@"調度前-----");
// 異步:把任務放到主隊列裏,可是不須要立刻執行。它跟for循環沒有關係,test1執行完畢以後他會所有執行完成。
dispatch_sync(queue,^{
NSLog(@"%@ %d",[NSThread currnetThread],i);
});
}
NSLog(@"完成---"); // 在這裏執行完畢以後會執行主隊列的東西。
}
注意:這個任務是執行不下去的,由於同步任務須要立刻執行,可是主線程上面正在執行test2,因此須要等待test2執行完畢以後才能執行同步任務,可是test2在等待這個同步任務執行結束,這樣就形成主線程阻塞,產生死鎖。誰也沒有辦法往下執行。
併發隊列:
-(void)test3
{
// 例子:有一個小說網站,必須登錄才能下載小說
// 分析:上面是有三個任務---1,用戶登陸 2,下載小說a 3,下載小說b
// 因此這個小說網站是經過同步執行。
dispatch_queue_t queue = dispatch_queue_create("cz",DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(queue,^{
NSLog(@"用戶登陸%@",[NSThread currentThread]);
});
}
**全局隊列**
/**
全局隊列跟併發隊列的區別
1.全局隊列:沒有名稱,併發隊列有名稱
2.全局隊列,是供全部的應用程序共享
3.再mrc開發,併發隊列建立完成,須要釋放;全局隊列不須要管理。
*/
-(void)test4
{
// 獲取全局隊列
// DISPATCH_QUEUE_PRIORITY_HIGH 2 高級優先級 IOS7.0
// DISPATCH_QUEUE_PRIORITY_DEFAULT 0 默認優先級 IOS7.0
// DISPATCH_QUEUE_PRIORITY_LOW (-2) 低優先級 IOS7.0
// DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN 後臺優先級 IOS7.0
// IOS8.0 QOS_CLASS_DEFAULT 0 ;
// 參數:1.優先級 (通常寫 0 能夠適配ios7盒ios8)2.預留參數(也是直接寫0)
dispatch_queue_t queue = dispatch_get_global_queue queue(0,0);
// 添加異步任務
dispatch_async(queue,^{
NSLog(@"用戶登陸%@",[NSThread currentThread]);
});
}
******************************************************************
** * 全局並行隊列 * 手動建立串行隊列 * 主隊列 *
******************************************************************
**同步並行 * 沒有開啓新線程 * 沒有開啓新線程 * 死鎖 *
* 串行執行任務 * 串行執行任務 *
**異步 * 有開啓新線程 * 有開啓新線程 * 沒有開啓新線程 *
* 並行執行任務 * 串行執行任務 * 串行執行任務 *
******************************************************************
隊列的選擇:
串行隊列異步執行
--開一條線程,順序執行。
--效率不高,執行的比較慢,資源佔用小->省電
使用場合:
通常網絡鏈接(3g 4g)對性能要求不會很高
併發隊列異步執行
--開啓多條線程,併發執行
--效率高,執行快。資源佔用大->費電。
使用場合:
-網絡wifi 或者須要很快響應,要求用戶體驗很是流暢。
-對任務執行順序沒有要求
同步任務:通常只會在併發隊列,須要阻塞後續任務,必須等待同步任務執行完畢,再去執行其餘任務。「依賴」關係。
從子線程回到主線程
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
// 執行耗時的異步操做。。。。
dispatch_async(dispatch_get_main_queue(),^{
// 回到主線程
});
});