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的形式