iOS线程相关的知识点

先来介绍几个概念:

同步执行:dispatch_sync,这个函数会把一个block加入到指定的队列中,而且会一直等到执行完blcok,这个函数才返回。因此在block执行完之前,调用dispatch_sync方法的线程是阻塞的。

异步执行:一般使用dispatch_async,这个函数也会把一个block加入到指定的队列中,但是和同步执行不同的是,这个函数把block加入队列后不等block的执行就立刻返回了。

串行队列:比如这里的dispatch_get_main_queue。这个队列中所有任务,一定按照先来后到的顺序执行。不仅如此,还可以保证在执行某个任务时,在它前面进入队列的所有任务肯定执行完了。对于每一个不同的串行队列,系统会为这个队列建立唯一的线程来执行代码。

并发队列:比如使用dispatch_get_global_queue。这个队列中的任务也是按照先来后到的顺序开始执行,注意是开始,但是它们的执行结束时间是不确定的,取决于每个任务的耗时。对于n个并发队列,GCD不会创建对应的n个线程而是进行适当的优化

队列添加任务的几种情况:

1.把任务放到串行队列中同步执行

不会创建新线程且切操作会顺序执行只要不放在主队列就不会阻塞主队列上的操作(各种系统的UI方法),这个操作只是选择了合适的时机在主线程上跑了一下而已~    系统主队列会造成死锁  系统全局队列或者自己创建的串行队列都不会死锁

intmain(intargc,constchar* argv[]) {

dispatch_sync(dispatch_get_main_queue(), ^(void){

NSLog(@"这里死锁了");

});

return0;

}

下面这个自己创建的串行队列添加同步任务也是在主线程运行,但是不会阻塞

- (IBAction)buttonOnClicked:(UIButton*)sender {

dispatch_queue_tmyQueue = dispatch_queue_create("myQueue",NULL);

dispatch_sync(myQueue, ^{for(NSIntegeri =0; i <100; i++) 

{// currentThread number = 1

NSLog(@"currentThread = %@, i = %ld", [NSThreadcurrentThread], (long) i);        }   

 });}

输出

// 注意这里的thread number = 1, 表示和buttonOnClicked都处于同样的main thread

currentThread = {number = 1, name = main}, i = 0

currentThread = {number = 1, name = main}, i = 1

...

currentThread = {number = 1, name = main}, i = 99

2、把任务放入串行队列异步执行:

操作顺序执行,创建了新的线程。顺序执行是因为队列是串行队列,采取的是先入先出的调度算法。而also over的打印在线程打印之前是因为我们采取的是异步执行方式,程序在将操作放入队列后不会等待这个block执行完成而是直接运行下面的代码我们还可以发现,至始至终操作都是在同一个线程上面执行(创建的线程)

- (IBAction)buttonOnClicked:(UIButton*)sender {

dispatch_queue_tmyQueue = dispatch_queue_create("myQueue",NULL);dispatch_async(

myQueue, ^{for(NSIntegeri =0; i <100; i++) {

// currentThread number = 2

NSLog(@"currentThread = %@, i = %ld", [NSThreadcurrentThread], (long) i);        }   

 });}

输出如下:

currentThread = {number = 2, name = (null)}, i = 0

currentThread = {number = 2, name = (null)}, i = 1

...

currentThread = {number = 2, name = (null)}, i = 99

3、把任务放入并发队列同步执行:

操作不会创建线程发现是顺序执行的。但是一定要清楚,这种顺序执行和操作队列为并发队列没有关系!而是因为这些操作均为同步操作,所以每一个操作放入队列后都会被等待执行完成才会放入下一操作,造成了这种顺序执行的现象。其实并发队列还是很想不那么顺序的用多线程去并发执行的

4、把任务放入并发队列异步执行:

显然,操作是无序的,且创建了不止一个线程。

Dispatch queue是一个对象,它可以接收任务,并将任务以先到先执行的顺序来执行。Dispatch queue可以使并发的或串行的。并发任务会基于系统负载来合适地并发执行,串行队列同一时间只执行单一任务。

GCD共有三种队列类型:

1、mainqueue:通过dispatch_get_main_queue()获得,这是一个与主线程相关的串行队列。

2、globalqueue:全局队列是并发队列,由整个进程共享。存在着高、中、低三种优先级的全局队列。调用dispath_get_global_queue并传入优先级来访问队列。

3、用户队列:通过函数dispatch_queue_create创建的队列,这些队列是串行的。

不管是serial queue还是conconcurrent queue, 所有的task都是FIFO的(不然怎么说是queue嘛)  

dispatch_once的作用就是只执行一次,我们在写单例的时候可以用到

+ (BWStatusBarOverlay*)shared{   

 static dispatch_once_tpred =0;

__strong static id _sharedObject = nil;

dispatch_once(&pred,^{        _sharedObject = [[self alloc] init];});

return _sharedObject;

}

dispatch_after  延迟执行

dispatch_queue_t dispatchQueue = dispatch_queue_create("ted.queue.next", DISPATCH_QUEUE_CONCURRENT);

dispatch_group_t dispatchGroup = dispatch_group_create();

dispatch_group_async(dispatchGroup, dispatchQueue, ^(){

NSLog(@"dispatch-1");

});

dispatch_group_async(dispatchGroup, dispatchQueue, ^(){

NSLog(@"dspatch-2");

});

dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^(){

NSLog(@"end");

});

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容