- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ dispatch_queue_t queue = dispatch_get_global_queue(0, 0); dispatch_async(queue, ^{ NSLog(@"1"); //这句话的本质是往runloop中添加定时器 [self performSelector:@selector(test) withObject:nil afterDelay:.0]; NSLog(@"3"); //若不启动runloop 子线程中是不会执行定时器的 打印结果为 1 3 执行了 打印结果为 1 3 2 [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; }); } -(void)test{ NSLog(@"2"); }
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ NSThread *thred = [[NSThread alloc]initWithBlock:^{ NSLog(@"1"); //启动runloop 这时候runloop是处于休眠状态 等待后面给它发消息 ;如不执行 打印为1 并且崩溃 [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantPast]]; }]; [thred start]; [self performSelector:@selector(test) onThread:thred withObject:nil waitUntilDone:YES]; } -(void)test{ NSLog(@"2"); }
线程组
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ dispatch_queue_t queue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_CONCURRENT); dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, queue, ^{ for (int i =0; i<5; i++) { NSLog(@"1-%@",[NSThread currentThread]); } }); dispatch_group_async(group, queue, ^{ for (int i =0; i<5; i++) { NSLog(@"2-%@",[NSThread currentThread]); } }); // dispatch_group_notify(group, queue, ^{ // dispatch_async(dispatch_get_main_queue(), ^{ // for (int i =0; i<5; i++) { // NSLog(@"3-%@",[NSThread currentThread]); // } // }); // }); 等价月=于下面 dispatch_group_notify(group, dispatch_get_main_queue(), ^{ for (int i =0; i<5; i++) { NSLog(@"3-%@",[NSThread currentThread]); } }); }
来源:https://www.cnblogs.com/ZhangShengjie/p/12269185.html