关于GCD中dispatch_after的问题

丶信步沧桑 2016-01-05 11:13:25
- (void)demo
{
//创建并发队列
dispatch_queue_t queue = dispatch_queue_create("sc", DISPATCH_QUEUE_CONCURRENT);
//异步执行
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:10];
NSLog(@"10s --- %@",[NSThread currentThread]);
});

//延时提交1,队列设置为自定义队列
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), queue, ^{

NSLog(@"第1个: 5s --- %@",[NSThread currentThread]);
});

//延时提交2,队列设置为自定义队列
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), queue, ^{

NSLog(@"第2个: 5s --- %@",[NSThread currentThread]);
});

//延时提交3,队列设置为自定义队列
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), queue, ^{

NSLog(@"第3个: 5s --- %@",[NSThread currentThread]);
});

}


demo如上
输出结果为
23:09:55.062 --- 10s --- <NSThread: 0x7fe700518100>{number = 2, name = (null)}
23:09:55.063 第2个: 5s --- <NSThread: 0x7fe700698280>{number = 3, name = (null)}
23:09:55.063 第1个: 5s --- <NSThread: 0x7fe700518100>{number = 2, name = (null)}
23:09:55.063 第3个: 5s --- <NSThread: 0x7fe700413e50>{number = 4, name = (null)}

不明白的地方在于时间, 为何三个dispatch_after的block执行时间实在10s之后?
...全文
2472 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2019-03-05
  • 打赏
  • 举报
回复
这个问题, 我也弄不懂。 因为开始的一遍, 确实是你那个打印。后来我杀掉程序重新来了一遍, 就变成现在这样了。有没有可能就是xcode的问题导致的你那种打印结果。
「已注销」 2019-03-05
  • 打赏
  • 举报
回复
好像结果运行的结果跟你不一样, 复制的是你的代码。就在前面加了一句打印。
「已注销」 2019-03-05
  • 打赏
  • 举报
回复
-(void) mytest {
NSLog(@"点击开始所在线程:%@", [NSThread currentThread]);
//创建并发队列
dispatch_queue_t queue = dispatch_queue_create("sc", DISPATCH_QUEUE_CONCURRENT);
//异步执行
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:10];
NSLog(@"10s --- %@",[NSThread currentThread]);
});

//延时提交1,队列设置为自定义队列
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), queue, ^{

NSLog(@"第1个: 5s --- %@",[NSThread currentThread]);
});

//延时提交2,队列设置为自定义队列
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), queue, ^{

NSLog(@"第2个: 5s --- %@",[NSThread currentThread]);
});

//延时提交3,队列设置为自定义队列
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), queue, ^{

NSLog(@"第3个: 5s --- %@",[NSThread currentThread]);
});
}

打印结果是
2019-03-05 15:09:03.401637+0800 PracticeDemo[28391:1420805] 点击开始所在线程:<NSThread: 0x60000349d380>{number = 1, name = main}
2019-03-05 15:09:08.402512+0800 PracticeDemo[28391:1420893] 第2个: 5s --- <NSThread: 0x6000034f6700>{number = 4, name = (null)}
2019-03-05 15:09:08.402521+0800 PracticeDemo[28391:1421269] 第1个: 5s --- <NSThread: 0x6000034f3a40>{number = 3, name = (null)}
2019-03-05 15:09:08.402547+0800 PracticeDemo[28391:1421270] 第3个: 5s --- <NSThread: 0x6000034f6840>{number = 5, name = (null)}
2019-03-05 15:09:13.404827+0800 PracticeDemo[28391:1420892] 10s --- <NSThread: 0x6000034f6a40>{number = 6, name = (null)}
CC_XF 2018-10-19
  • 打赏
  • 举报
回复
因为你创建的是全局队列,撇开延时函数,一个普通的全局队列会随机开辟线程,具体执行时不确定的,但是在多并发的前提下会同时执行,具体先执行那个的话是不确定的。大量调用之后你会发现不是简单的就这么一个顺序
dirdirdir3 2016-03-08
  • 打赏
  • 举报
回复
同一个队列也就是会进入队列(线程)里面,先后执行。
dirdirdir3 2016-03-08
  • 打赏
  • 举报
回复
你dispatch到了同一个队列,这样就不是异步的了
lovelydark0115 2016-03-07
  • 打赏
  • 举报
回复
sleep()和dispatch_after是不一样的, 一个是延时执行, 一个是延时提交 自己看下概念
丶信步沧桑 2016-01-05
  • 打赏
  • 举报
回复
队列和线程的关系是怎样的呢? 当前queue所在的线程虽然休眠了10s 但是这个函数dispatch_asyn是异步的啊, 不应该开启其他线程来继续从queue中获取任务执行么? 如果说队列会对线程造成影响的话,能不能详细说一下会造成怎样的影响?
ArcRain 2016-01-05
  • 打赏
  • 举报
回复
因为你异步执行里面将当前queue所在的线程休眠了10秒,导致后续queue里的任务都延时了10秒。

29,027

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧