一、同步/異步、串行/并行的區別
1.同步/異步
同步/異步是指線程與線程之間的關系。
2.串行/并行
串行、并行是指隊列內部任務與任務之間的關系。
如果是串行隊列,那么隊列內部的任務是按順序執行的。
如果是并行隊列,那么隊列內部的任務執行時無序的,沒有先后順序。
二、線程與隊列
1.線程
//同步線程
dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)
//異步線程
dispatch_async(<#dispatch_queue_t queue#>,<#^(void)block#>)
2.隊列
//創建一個串行隊列
dispatch_queue_t queue=dispatch_queue_create("label",DISPATCH_QUEUE_SERIAL);
//創建一個并行隊列
dispatch_queue_t queue=dispatch_queue_create("label",DISPATCH_QUEUE_CONCURRENT);
//獲取全局隊列,全局隊列是并行的
dispatch_queue_t queue=dispatch_get_global_queue(0,0);
//獲取主線程的隊列,主線程隊列是串行的
dispatch_queue_t queue=dispatch_get_main_queue();
三、幾種常見的任務處理方式
1.異步串行隊列
dispatch_queue_t queue=dispatch_queue_create("queue",DISPATCH_QUEUE_SERIAL);?
? ? ? for(int I=0;i<10;i++){
? ? ? ? ? dispatch_async(queue,^{
? ? ? ? ? ? ? NSLog(@"----------%d",i);
? ? ? ? ?});
? ? ?}
隊列中所有任務在異步線程中按順序執行,結果如下:
2.異步并行隊列
dispatch_queue_t queue=dispatch_queue_create("queue",DISPATCH_QUEUE_CONCURRENT);
? ? for(int I=0;i<10;i++){
? ? ? ? ?dispatch_async(queue,^{
? ? ? ? ? ? ?NSLog(@"----------%d",i);
? ? ? ? });
? ? }
隊列中所有任務在異步線程并行執行,無先后順序,結果如下:
3.異步串行隊列,并在任務完成后進行通知
dispatch_group_t group=dispatch_group_create();
dispatch_queue_t queue=dispatch_queue_create("queue",DISPATCH_QUEUE_SERIAL);
for(int i=0;i<10;i++){
? ? ? dispatch_group_async(group,queue,^{
? ? ? ? ? ? NSLog("-----------%d",i);
? ? ? ?});
}
dispatch_group_notify(group,queue,^{
NSLog("任務執行完畢!");
}
運行結果如下:
dispatch_group_t group=dispatch_group_create();
dispatch_queue_t queue =dispatch_queue_create("queue",DISPATCH_QUEUE_CONCURRENT);
for(int i=0;i<10;i++){
dispatch_group_async(group,queue,^{
NSLog("--------%d",i);
});
}
dispatch_group_notify(group,queue,^{
NSLog("任務執行完畢!");
});
結果如下: