IOS线程数据篇8之GCD功能使用大全:队列阻塞挂起(一次激活所有阻塞任务)
2014-11-24 16:08
417 查看
多线程中GCD的使用是IOS中一个线程使用的一个非常重要的部分,
下面分析一下队列挂起如何使用:
q1 = dispatch_queue_create("com.fwzhengwei.www", DISPATCH_QUEUE_CONCURRENT);
dispatch_suspend(q1);
首先创建一个队列,设置为并行队列,并将这个队列挂起。
之后在另一个方法中添加如下代码:
for (int i = 0; i < 10; ++i) {
NSLog(@"任务已经挂起无法启动!");
dispatch_async(q1, ^{
NSLog(@"%@ %d", [NSThread currentThread], i);
});
}
这里所有的任务添加到队列之后,实际上队列是挂起的。
当点击按钮之后,在按钮的回调方法中:
-(void)buttonaction1{
NSLog(@"xxxxx 激活所有阻塞线程");
dispatch_resume(q1);
}
代码的运行结果可以参考如下:
程序启动
2014-11-24 16:05:25.757 GCDTest[1996:145594] buttonaction
所有子线程任务都被挂起
2014-11-24 16:05:25.758 GCDTest[1996:145594] 任务已经挂起无法启动!
2014-11-24 16:05:25.758 GCDTest[1996:145594] 任务已经挂起无法启动!
2014-11-24 16:05:25.758 GCDTest[1996:145594] 任务已经挂起无法启动!
2014-11-24 16:05:25.758 GCDTest[1996:145594] 任务已经挂起无法启动!
2014-11-24 16:05:25.758 GCDTest[1996:145594] 任务已经挂起无法启动!
2014-11-24 16:05:25.758 GCDTest[1996:145594] 任务已经挂起无法启动!
2014-11-24 16:05:25.759 GCDTest[1996:145594] 任务已经挂起无法启动!
2014-11-24 16:05:25.759 GCDTest[1996:145594] 任务已经挂起无法启动!
2014-11-24 16:05:25.759 GCDTest[1996:145594] 任务已经挂起无法启动!
2014-11-24 16:05:25.759 GCDTest[1996:145594] 任务已经挂起无法启动!
点击按钮之后所有的队列中的任务都被重新激活
2014-11-24 16:05:26.469 GCDTest[1996:145594] xxxxx 激活所有阻塞线程
2014-11-24 16:05:26.470 GCDTest[1996:145631] <NSThread: 0x7ae4dd50>{number = 2, name = (null)} 0
2014-11-24 16:05:26.470 GCDTest[1996:145631] <NSThread: 0x7ae4dd50>{number = 2, name = (null)} 2
2014-11-24 16:05:26.470 GCDTest[1996:145632] <NSThread: 0x7b933a30>{number = 3, name = (null)} 1
2014-11-24 16:05:26.470 GCDTest[1996:145631] <NSThread: 0x7ae4dd50>{number = 2, name = (null)} 3
2014-11-24 16:05:26.470 GCDTest[1996:145632] <NSThread: 0x7b933a30>{number = 3, name = (null)} 4
2014-11-24 16:05:26.470 GCDTest[1996:145633] <NSThread: 0x7ba87970>{number = 4, name = (null)} 5
2014-11-24 16:05:26.471 GCDTest[1996:145631] <NSThread: 0x7ae4dd50>{number = 2, name = (null)} 7
2014-11-24 16:05:26.470 GCDTest[1996:145634] <NSThread: 0x7b82ffe0>{number = 5, name = (null)} 6
2014-11-24 16:05:26.471 GCDTest[1996:145632] <NSThread: 0x7b933a30>{number = 3, name = (null)} 8
2014-11-24 16:05:26.471 GCDTest[1996:145633] <NSThread: 0x7ba87970>{number = 4, name = (null)} 9
dispatch除了可以挂起任务之外,还有一个单例的功能。
dispatch_once 可以保证代码在一段时间内只被执行一次。
+ (FWSDKContext *)sharedContext
{
static FWSDKContext *sharedInstance = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
下面分析一下队列挂起如何使用:
q1 = dispatch_queue_create("com.fwzhengwei.www", DISPATCH_QUEUE_CONCURRENT);
dispatch_suspend(q1);
首先创建一个队列,设置为并行队列,并将这个队列挂起。
之后在另一个方法中添加如下代码:
for (int i = 0; i < 10; ++i) {
NSLog(@"任务已经挂起无法启动!");
dispatch_async(q1, ^{
NSLog(@"%@ %d", [NSThread currentThread], i);
});
}
这里所有的任务添加到队列之后,实际上队列是挂起的。
当点击按钮之后,在按钮的回调方法中:
-(void)buttonaction1{
NSLog(@"xxxxx 激活所有阻塞线程");
dispatch_resume(q1);
}
代码的运行结果可以参考如下:
程序启动
2014-11-24 16:05:25.757 GCDTest[1996:145594] buttonaction
所有子线程任务都被挂起
2014-11-24 16:05:25.758 GCDTest[1996:145594] 任务已经挂起无法启动!
2014-11-24 16:05:25.758 GCDTest[1996:145594] 任务已经挂起无法启动!
2014-11-24 16:05:25.758 GCDTest[1996:145594] 任务已经挂起无法启动!
2014-11-24 16:05:25.758 GCDTest[1996:145594] 任务已经挂起无法启动!
2014-11-24 16:05:25.758 GCDTest[1996:145594] 任务已经挂起无法启动!
2014-11-24 16:05:25.758 GCDTest[1996:145594] 任务已经挂起无法启动!
2014-11-24 16:05:25.759 GCDTest[1996:145594] 任务已经挂起无法启动!
2014-11-24 16:05:25.759 GCDTest[1996:145594] 任务已经挂起无法启动!
2014-11-24 16:05:25.759 GCDTest[1996:145594] 任务已经挂起无法启动!
2014-11-24 16:05:25.759 GCDTest[1996:145594] 任务已经挂起无法启动!
点击按钮之后所有的队列中的任务都被重新激活
2014-11-24 16:05:26.469 GCDTest[1996:145594] xxxxx 激活所有阻塞线程
2014-11-24 16:05:26.470 GCDTest[1996:145631] <NSThread: 0x7ae4dd50>{number = 2, name = (null)} 0
2014-11-24 16:05:26.470 GCDTest[1996:145631] <NSThread: 0x7ae4dd50>{number = 2, name = (null)} 2
2014-11-24 16:05:26.470 GCDTest[1996:145632] <NSThread: 0x7b933a30>{number = 3, name = (null)} 1
2014-11-24 16:05:26.470 GCDTest[1996:145631] <NSThread: 0x7ae4dd50>{number = 2, name = (null)} 3
2014-11-24 16:05:26.470 GCDTest[1996:145632] <NSThread: 0x7b933a30>{number = 3, name = (null)} 4
2014-11-24 16:05:26.470 GCDTest[1996:145633] <NSThread: 0x7ba87970>{number = 4, name = (null)} 5
2014-11-24 16:05:26.471 GCDTest[1996:145631] <NSThread: 0x7ae4dd50>{number = 2, name = (null)} 7
2014-11-24 16:05:26.470 GCDTest[1996:145634] <NSThread: 0x7b82ffe0>{number = 5, name = (null)} 6
2014-11-24 16:05:26.471 GCDTest[1996:145632] <NSThread: 0x7b933a30>{number = 3, name = (null)} 8
2014-11-24 16:05:26.471 GCDTest[1996:145633] <NSThread: 0x7ba87970>{number = 4, name = (null)} 9
dispatch除了可以挂起任务之外,还有一个单例的功能。
dispatch_once 可以保证代码在一段时间内只被执行一次。
+ (FWSDKContext *)sharedContext
{
static FWSDKContext *sharedInstance = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
相关文章推荐
- IOS线程数据篇9之GCD功能使用大全:信号量的使用
- iOS边练边学--GCD的基本使用、GCD各种队列、GCD线程间通信、GCD常用函数、GCD迭代以及GCD队列组
- iOS中多线程知识总结:进程、线程、GCD、串行队列、并行队列、全局队列、主线程队列、同步任务、异步任务等(有示例代码)
- iOS中多线程知识总结:进程、线程、GCD、串行队列、并行队列、全局队列、主线程队列、同步任务、异步任务等
- iOS边练边学--多线程NSOperation介绍,子类实现多线程的介绍(任务和队列),队列的取消、暂停(挂起)和恢复,操作依赖与线程间的通信
- iOS中多线程知识总结:进程、线程、GCD、串行队列、并行队列、全局队列、主线程队列、同步任务、异步任务等
- IOS线程数据篇10之Sqlite3数据库的使用
- 使用Java程序一次分段读取所有数据(如海量数据)并计数处理
- ios下使用runloop阻塞线程
- IOS开发(64)之GCD任务最多只执行一次
- GCD:dispatch_sync会在当前线程中执行派发到其他队列的任务
- IOS线程数据篇3之多线程:NSThread NSOperation GCD(二)
- IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)
- IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)
- 线程之三个小面试题 并发集合数据的访问 阻塞队列
- ios开发单例模式——使用GCD实现单例模式 & 非ARC单例模式 &使用GCD和线程锁实现单例模式
- Java -- 使用阻塞队列(BlockingQueue)控制线程通信
- 使用 Task 替换 ThreadPool ,异步监测所有线程(任务)是否全部执行完毕
- FreeRTOS学习笔记——任务间使用队列同步数据
- 猫猫学iOS(五十一)多线程网络之GCD下载合并图片_队列组的使用