NSThread、NSOperation、GCD、NSOperationQueue

来源:互联网 发布:淘宝店铺行业怎么改 编辑:程序博客网 时间:2024/05/17 06:09

NSThread轻量级(每一个NSOperation对象对应一个线程)

缺点:需要自己管理线程的生命周期,线程同步,同时线程同步对数据的加锁有一定的系统开销。

NSOperation:面向对象的线程技术,不需要关心线程管理,数据同步的问题,可以吧精力放在数据的操作上!

GCD:是局域C语言框架的


1:使用NSThread

便利构造器的方式创建:[NSThread detachNewThreadSelector:@selector(oneThread:) toTarget:self withObject:nil]

[self performSelectorOnMainThread:@selector(oneThread)   withObject:nil waitUnitilDone:YES]

[mThread cancel] //标记当前线程的状态为cancel,但是线程并没有被杀死,若线程中正在执行循环操作,则必须判断当前线程的状态


2:NSOperationQueue默认是串行队列(并发执行的)

NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithblock:^{


NSLog(@"1");

}]

NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithblock:^{


NSLog(@"2");

}]

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

[queue addOperation:operation1];

[queue addOperation:operation2];

默认先执行线程一,然后再执行线程二

但是现实状态下有这样的需求:当多个线程执行完成时才执行其他的操作,则这里需要设置线程之间的依赖关系,添加依赖关系[operation1 addDependency:operation2],之后线程一得等到线程二执行完毕时才会被执行

2.1队列中的线程执行顺序主要取决于两点

1:首先看NSOperation是否准备就绪,主要看operation中是否含有依赖关系

2: 可通过设置operation的优先级setQueuePriority

2.2设置线程的最大并发数

[queue setMaxConcurrentOperationCount:1]

可通过它来改变线程的执行顺序,当设置并发数为一时,线程的优先级将无效,单依赖关系依然有效

2.3暂停和继续operation,queue

[operation1 waitUnitlFinish]//这样会破坏程序的并发性

[queue setSuspended:NO]


3:GCD它是基于C语言实现的(完全由系统管理线程)

核心理念:将长期运行的任务拆分成多个工作单元,并将这写单元添加到dispatch queue中,严格遵循FIFO原则,分为串行(serial)和并行(concurrent)

3.1顺序执行

dispatch_queue_t queue = dispatch_queue_create("serial",NULL);

dispatch_queue_t queue1 = dispatch_get_main_queue()

3.2并发执行

dispatch_queue_t queue = dispatch_get_global_queue(0,0);

3.3 假设有这样的一种情况,三个任务,任务一,二,三,任务三得等到任务一,二执行完毕才执行,则可利用group的形式


0 0
原创粉丝点击