您的位置:首页 > 其它

GCD之 串行队列,并行队列,全局队列,主线程队列

2016-02-27 20:03 267 查看
先假设不管同步还是异步任务都有10个吧
1.串行队列同步任务:按顺序一个一个执行,并且在主线程
2.串行队列异步任务:异步任务虽然是并发的,但是由于在串行队列中,所以还是按顺序一个一个执行的,并且是开启了一条子线程
3.并行队列同步任务:按顺序一个一个执行,并且在主线程
4.并行队列异步任务:开启多个子线程,并发执行,人为无法控制
5.并行队列中先有10个同步任务,再有10个异步任务:先在主线程中按顺序执行同步任务,当同步任务完成后,开启多个子线程并发异步任务
6.并行队列中先有10个异步任务,再有10个同步任务:开启子线程并发异步任务,主线程中执行同步任务,异步任务和同步任务相互掺杂
7.全局队列:全局队列效果与并行队列一样
8.主线程队列同步任务:会阻塞
9.主线程队列异步任务:按顺序执行
10.串行队列同步嵌同步会阻塞
/*进程:正在进行中的程序被称为进程,负责程序运行的内存分配线程:是进程中一个独立的执行路径,负责程序中代码的实际运行1.一个进程中至少包含一条线程。可以将耗时的执行路径放在其他线程中执行2.创建线程的目的就是为了开启一条新的执行路径,运行指定的代码,与主线程中的代码实现同时运行。3.线程没有完成之前不能被杀掉,但是可以暂停,休眠。4.并发:指两个或多个任务在同一时间间隔内发生,实际上在任意一个时刻点上,CPU只会处理一个任务。5.多线程:优势:将耗时任务分配到其他线程执行,由主线程负责统一更新界面会使应用更加流畅,用户体验更好。劣势:新建线程会消耗内存空间和CPU时间,线程太多会降低系统的运行性能。*//*iOS的三种多线程技术(1)NSThread(2)NSOperation:限制最大并发数量,操作之间的依赖关系(3)GCD:基于C语言的底层API用Block定义任务,使用起来灵活便捷GCD的基本思想就是将操作s放在队列s中去执行1.操作使用Blocks定义2.队列负责调度任务所在的线程以及具体的执行时间3.队列的特点是先进先出4.GCD的函数都是以dispatch开头的dispatch_queue_t>串行队列,队列中的任务只会顺序执行>并行队列,队列中的任务通常并发执行dispatch_async 异步操作,会并发执行,无法确定任务的执行顺序dispatch_sync  同步操作,会依此顺序执行,能够决定任务的执行顺序5.多线程技术的目的,就是为了在一个CPU上实现快速切换*/#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad{[super viewDidLoad];//number=1,表示主线程NSLog(@"当前调用线程:%@",[NSThread currentThread]);//[self gcdDemo1];//[self gcdDemo2];//[self gcdDemo3];[self gcdDemo4];}//串行队列(排队跑步)-(void)gcdDemo1{//将操作放在队列中//在C语言函数中,定义类型,绝大多数的结尾是_t或者ref//创建一个串行队列//使用串行队列的异步任务是非常有用的,新建子线程是有开销的,不能无休止新建线程//既可以保证效率,又可以实现并发???//1.从网络上下载图片//2.滤镜(高光红眼)dispatch_queue_t queue=dispatch_queue_create("gujinyue", DISPATCH_QUEUE_SERIAL);//串行队列的同步任务同样会在主线程运行//在开发中几乎没用for(int i=0;i<10;i++){dispatch_sync(queue, ^{NSLog(@"串行队列同步任务%@",[NSThread currentThread]);});}for(int i=0;i<10;i++){//异步任务并发执行,但是被放在了串行队列里面,仍然会依此顺序执行dispatch_async(queue, ^{//可以在开发中,跟踪当前线程NSLog(@"串行队列异步任务:%@ %d",[NSThread currentThread],i);});}}//并行队列(并排跑)-(void)gcdDemo2{//没有队形,执行顺序程序员不能控制//并行队列容易出错,也不能控制新建线程的数量//创建一个并行队列dispatch_queue_t queue=dispatch_queue_create("gujinyue2", DISPATCH_QUEUE_CONCURRENT);//ARC不需要这句话//dispatch_release(queue);//二者调换顺序看看情况//并行队列的同步任务同样会在主线程运行for(int i=0;i<10;i++){dispatch_sync(queue, ^{NSLog(@"并行队列同步任务%@",[NSThread currentThread]);});}//并行队列的异步任务for(int i=0;i<10;i++){//异步任务dispatch_async(queue, ^{//可以在开发中,跟踪当前线程NSLog(@"并行队列异步任务:%@ %d",[NSThread currentThread],i);});}}//全局队列(苹果为了方便多线程的设计,提供了全局变量)-(void)gcdDemo3{//全局队列不需要创建,用get直接获得//执行效果与并行队列相同//全局队列没有名称,调试时,无法确认准确队列//调度队列优先级dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);for(int i=0;i<10;i++){dispatch_sync(queue, ^{NSLog(@"同步任务%@",[NSThread currentThread]);});}for(int i=0;i<100;i++){//异步任务dispatch_async(queue, ^{//可以在开发中,跟踪当前线程NSLog(@"异步任务:%@ %d",[NSThread currentThread],i);});}}//主线程队列,保证操作在主线程上执行-(void)gcdDemo4{//每一个应用程序都只有一个主线程//在iOS开发中,所有的UI更新操作,都必须在主线程上执行dispatch_queue_t queue=dispatch_get_main_queue();//注意:主线程是有工作的,除非将程序杀掉,否则主线程的工作永远不会结束//主线程上只能是异步任务//会阻塞//    dispatch_sync(queue, ^{//        NSLog(@"come here baby");//    });//异步任务,在主线程上运行,同时是保持队形的(即主队列中的操作在主线程上是顺序执行的)for(int i=0;i<10;i++){//异步任务dispatch_async(queue, ^{//可以在开发中,跟踪当前线程NSLog(@"异步任务:%@ %d",[NSThread currentThread],i);});}}@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: