一、同步/異步埂陆、串行/并行的區(qū)別
1.同步/異步
同步/異步是指線程與線程之間的關(guān)系煌张。
2.串行/并行
串行呐赡、并行是指隊列內(nèi)部任務(wù)與任務(wù)之間的關(guān)系。
如果是串行隊列骏融,那么隊列內(nèi)部的任務(wù)是按順序執(zhí)行的链嘀。
如果是并行隊列萌狂,那么隊列內(nèi)部的任務(wù)執(zhí)行時無序的,沒有先后順序怀泊。
二茫藏、線程與隊列
1.線程
//同步線程
dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)
//異步線程
dispatch_async(<#dispatch_queue_t queue#>,<#^(void)block#>)
2.隊列
//創(chuàng)建一個串行隊列
dispatch_queue_t queue=dispatch_queue_create("label",DISPATCH_QUEUE_SERIAL);
//創(chuàng)建一個并行隊列
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();
三刷允、幾種常見的任務(wù)處理方式
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);
? ? ? ? ?});
? ? ?}
隊列中所有任務(wù)在異步線程中按順序執(zhí)行,結(jié)果如下:
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);
? ? ? ? });
? ? }
隊列中所有任務(wù)在異步線程并行執(zhí)行碧囊,無先后順序树灶,結(jié)果如下:
3.異步串行隊列,并在任務(wù)完成后進行通知
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("任務(wù)執(zhí)行完畢糯而!");
}
運行結(jié)果如下:
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("任務(wù)執(zhí)行完畢!");
});
結(jié)果如下: