GCD编程-串行队列与并发队列

接着上面的GCD封装,以下进行列子验证

1.导入GCD.h

2.创一个串行队列:

- (void)serailQueue{

//创建出队列

GCDQueue *queue =  [[GCDQueue alloc]initSerial];

//运行队列中的线程

[queue execute:^{

NSLog(@"1");

}];

[queue execute:^{

NSLog(@"2");

}];

[queue execute:^{

NSLog(@"3");

}];

[queue execute:^{

NSLog(@"4");

}];

[queue execute:^{

NSLog(@"5");

}];

}

得出串行结果:

2015-07-11 10:34:28.641 GCDDelay[2262:174638] 1

2015-07-11 10:34:28.642 GCDDelay[2262:174638] 2

2015-07-11 10:34:28.642 GCDDelay[2262:174638] 3

2015-07-11 10:34:28.642 GCDDelay[2262:174638] 4

2015-07-11 10:34:28.643 GCDDelay[2262:174638] 5

3.并发队列

- (void)initConcurrent{

GCDQueue *queue =  [[GCDQueue alloc]initConcurrent];

//运行队列中的线程

[queueexecute:^{

NSLog(@"1");

}];

[queue execute:^{

NSLog(@"2");

}];

[queue execute:^{

NSLog(@"3");

}];

[queue execute:^{

NSLog(@"4");

}];

[queue execute:^{

NSLog(@"5");

}];

}

得出并发结果:

2015-07-11 10:38:28.849 GCDDelay[2303:178328] 3

2015-07-11 10:38:28.849 GCDDelay[2303:178334] 4

2015-07-11 10:38:28.849 GCDDelay[2303:178325] 2

2015-07-11 10:38:28.849 GCDDelay[2303:178327] 1

2015-07-11 10:38:28.850 GCDDelay[2303:178335] 5

4.globalQueue 是默认级别的子线程 。一般在子线程中处理业务逻辑,主线程中更新UI

[GCDQueue
executeInGlobalQueue:^{

//处理业务逻辑

NSURLRequest *request   = [NSURLRequestrequestWithURL:[NSURLURLWithString:@"***"]];

NSData      *picData    =[NSURLConnectionsendSynchronousRequest:request

returningResponse:nilerror:nil];

self.image = [UIImage imageWithData:picData];

[GCDQueue executeInMainQueue:^{

//主线程中更新UI

self.imageView.image =self.image;

}];

}];

总结:

串行队列一次仅仅运行一个线程,依照加入到队列的顺序依次运行

并发队列一次能够运行多个线程,线程的运行没有先后顺序

UI界面所在的线程队列是串行队列

时间: 2025-01-05 13:35:47

GCD编程-串行队列与并发队列的相关文章

ios多线程操作(五)—— GCD串行队列与并发队列

GCD的队列可以分为2大类型,分别为串行队列和并发队列 串行队列(Serial Dispatch Queue): 一次只调度一个任务,队列中的任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务) 创建一个队列 dispatch_queue_t q = dispatch_queue_create(const char *label, dispatch_queue_attr_t attr) 参数: const char *label:队列的名称 dispatch_queue_attr_t

串行队列和并发队列的选择

-并发队列,开多个线程,并发的效率高! 好处:快,用户交互好! 坏处:"费电",如果用户在wifi环境! -串行队列,开一个线程,效率不高 好处:省电,有的时候,用户不希望太快!3G-省钱 坏处:慢,效率不高! 网络框架,需要考虑用户的网络环境!针对用户的网络环境有选择的决定开辟线程的数量! 线程数量如何选择: 3G:        2~3条 Wi-Fi:     6条

阻塞队列和并发队列

在并发编程中我们有时候需要使用线程安全的队列.要实现一个线程安全的队列有两种实现方式:一种是使用阻塞算法,另一种是使用非阻塞算法. 使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,其中阻塞队列的典型是:BlockingQueue; 非阻塞的实现方式则可以使用循环CAS的方式来实现,非阻塞队列的典型例子是ConcurrentLinkedQueue. 注:并行与并发的区别: 1.并行是指两者同时执行一件事,比如赛跑,两个人都在不停的往前跑: 2.并

并行执行、串行执行和并发执行

并发执行是多道程序系统中多个程序(逻辑上互相独立)或者一个程序中的多个程序段在执行的过程当中,时间互相重叠,一个程序执行没结束,另一个已经开始. 并行执行是指一组程序按照独立的,不同步的速度执行,时间上不重叠: 串行就是指令一个一个的执行.并行是指令同时并行执行. 总结: 并发是指多个线程轮流执行(单核CPU): 并行是指多个线程同时执行(多核CPU),微观上是同时的: 串行是指一个一个的执行,处理完一个才能处理下一个,不轮换: 原文地址:https://www.cnblogs.com/feix

并发编程(十)—— Java 并发队列 BlockingQueue 实现之 SynchronousQueue源码分析

BlockingQueue 实现之 SynchronousQueue SynchronousQueue是一个没有数据缓冲的BlockingQueue,生产者线程对其的插入操作put必须等待消费者的移除操作take,反过来也一样. 不像ArrayBlockingQueue或LinkedListBlockingQueue,SynchronousQueue内部并没有数据缓存空间,你不能调用peek()方法来看队列中是否有数据元素,因为数据元素只有当你试着取走的时候才可能存在,不取走而只想偷窥一下是不行

同步,异步,串行队列,并发队列,全局队列,主队列等概念的总结

同步,异步,串行队列,并发队列,全局队列,主队列等概念的总结 在GCD函数中, 我们常常碰到同步,异步,串行队列,并发队列,全局队列,主队列等概念,而这些概念又常常组合在一起, 十分头疼, 这篇文章就来梳理一下这些烦人的概念. 不想看长篇大论的, 直接看文章末尾的表格即可! 在此之前, GCD中还涉及到两个十分重要的概念, 就是任务和队列 任务(Task): 你需要执行的操作 队列(Queue): 存放任务的容器 GCD中两个重要的函数, 一个同步执行, 一个异步执行 dispatch_asyn

iOS-线程之GCD方式---之同步异步和串行队列并行队列之间的关系

GCD方式是Apple官方推荐实现多线程的方式 但在这之前必须理清楚同步,异步,串行队列,并行队列之间的概念. 同步:即当前的执行程序块不会创建一个新的线程,只能在当前线程中执行. 异步:会在当前的线程之外创建一个新的线程,并在新的线程中执行代码块. 首先声明一点,队列是用来存放即将执行的线程体的. 串行队列:串行队列中的线程满足FIFO(First In First Out),并且只有在先出的线程执行完,后续的线程才能出队列执行.(很可能造成APP的假死状态) 并行队列:并行队列也满足FIFO

《iOS面试之道》-“串行队列的代码实战” 勘误

一.原书第一版154页开始讲解串行队列.并发队列.以及在Dispatch_Async.Dispatch_Sync下面的作用 最后一段代码: if(_q == NULL) { _q = dispatch_queue_create("SerialQueue", DISPATCH_QUEUE_SERIAL); } NSMutableString *str = [[NSMutableString alloc] init]; [str appendString:@"1"];

iOS中的串行,并行,分组,一次,障碍,延迟,反复执行(GCD)

#import "OneViewController.h" @interface OneViewController () @end @implementation OneViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. } - (void)didReceiveMemoryWarning { [super didRece