NSThread ,GCD,NSOperation 多线程

GCD

1、创建GCD任务的方式有

1、dispatch_async(异步执行)

2、dispatch_sync (同步执行)

2、创建GCD任务时需要加入到队列中执行。GCD中的队列有

1、串行队列

2、并行队列

3、主队列 (GCD自带的一种特殊的串行队列)

。所有放在主队列中的任务,都会放到主线程中执行

。可使用dispatch_get_main_queue()获得主队列

3、创建GCD有6种不同的组合方式

1、同步执行 + 串行队列  (不会开启新线程,在当前线程执行任务。任务是串行的,执行完一个任务,再执行下一个任务。)

2、同步执行 + 并行队列 (特点:在当前线程中执行任务,不会开启新线程,执行完一个任务,再执行下一个任务。)

3、同步执行 + 主队列 (同步执行 + 主队列在不同线程中调用结果也是不一样,在主线程中调用会出现死锁,而在其他线程中则不会。在其他线程中,不会开启新线程,执行完一个任务,再执行下一个任务)

4、异步执行 + 串行队列   (会开启新线程,但是因为任务是串行的,执行完一个任务,再执行下一个任务)

5、异步执行 + 并行队列 ( 特点:可以开启多个线程,任务交替(同时)执行。)

6、异步执行 + 主队列   (只在主线程中执行任务,执行完一个任务,再执行下一个任务。)


异步执行一个串行队列的时候,开启一个新线程01,多次调用后,只在新线程01内执行。

异步一个并行队列,开启一个新的线程01,多次调用后,开启不同的新线程02,线程03.....。

同步执行一个串行队列时,没有开启新线程,如果在queue所在的线程上开启会造成死锁。

同步一个并行队列,没有开启新线程。

4、GCD的其他方法

4.1、dispatch_apply GCD 快速迭代方法

通常我们会用 for 循环遍历,但是 GCD 给我们提供了快速迭代的函数dispatch_apply。dispatch_apply按照指定的次数将指定的任务追加到指定的队列中,并等待全部队列执行结束。

dispatch_queue_t applyQueue = dispatch_queue_create("com.laxton.applyQueue", DISPATCH_QUEUE_CONCURRENT);

    size_tcount =10;

    //如果是串行队列循环执行全部在主线程上。如果在并发队列中开启新的线程循环执行。

    dispatch_apply(count, applyQueue, ^(size_ti) {

        NSLog(@"循环执行第%li次 %@",i,[NSThreadcurrentThread]);

    });

4.2 GCD 栅栏方法:dispatch_barrier_async

在执行完栅栏前面的操作之后,才执行栅栏操作,最后再执行栅栏后边的操作。

4.3 dispatch_group_wait

暂停当前线程(阻塞当前线程),等待指定的 group 中的任务执行完成后,才会往下继续执行。

4.4  dispatch_group_enter、dispatch_group_leave

从dispatch_group_enter、dispatch_group_leave相关代码运行结果中可以看出:当所有任务执行完成之后,才执行 dispatch_group_notify 中的任务。这里的dispatch_group_enter、dispatch_group_leave组合,其实等同于dispatch_group_async。

作者:行走的少年郎

链接:https://www.jianshu.com/p/2d57c72016c6

來源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

NSOperation

系统提供两种Operation

1、NSInvocationOperation 加入队列后开启新线程执行任务

NSInvocationOperation*invocationOperation = [[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(loadImageSource:)object:@"imageUrl"];

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    [queueaddOperation:invocationOperation];

2、NSBlockOperation 加入队列后开启新线程执行任务

NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{

        [self loadImageSource:@"www."];

    }];

    [queueaddOperation:blockOperation];

NSOperation 与 CGD相比

1、可以设置两个任务之间的依赖

2、可以设置一个任务在队列中的优先级

3、可以设置队列的最大并发数。(允许同时进行几个任务)

NSThread

优点:

1、(有几个属性BOOL executing,BOOL finished,BOOL cancelled)可以检查到线程的状态。

2、(有方法 - (void)cancel,- (void)start, + (void)exit;)来操作线程开始和取消跟退出。

3、轻量级,是真正的多线程。

4、(+ (BOOL)setThreadPriority:(double)p;)可以设置线程优先级。

缺点:

1、要自己手动管理线程生命周期,不支持多核。

CGD

优点:

支持多核,高效,使用简便不需要管理线程周期

缺点:

1、不能检测到线程状态。

2、不能设置线程优先级。

3、线程数不可控。

NSOperation

优点:

1、(有属性:BOOL cancelled,BOOL executing,BOOL finished)可以检测到任务的状态。

2、(有方法- (void)cancel,如果你的操作已经执行,它不会让你的任务立即停止,只是更新任务的内部标志,如果操作还没有执行,则取消队列里的操作,如果操作已经完成,则此方法没有任何效果)

3、(有方法- (void)addDependency:(NSOperation*)op;- (void)removeDependency:(NSOperation*)op;)添加依赖删除依赖。)

4、(有属性NSOperationQueuePriority queuePriority;)可以设置操作优先级

5、(可以添加到NSOperationQueue中实现并发执行,NSOperationQueue 属性maxConcurrentOperationCount可以设置可以同时执行的最大操作数)

缺点:

是抽象类,要创建子类才能使用。

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

推荐阅读更多精彩内容