串行队列
dispatch_queue_t queue = dispatch_queue_create("testQueue", DISPATCH_QUEUE_SERIAL);
并发队列
dispatch_queue_t queue = dispatch_queue_create("testQueue2", DISPATCH_QUEUE_CONCURRENT);
主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
全局并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
同步执行
dispatch_sync(queue, ^{
//这里放同步执行任务代码
});
异步执行
dispatch_async(queue, ^{
//这里放异步执行任务代码
});
同步+并发队列 = 没有开启新线程,串行执行任务 sync Concurrent
同步+串行队列 = 没有开启新线程,串行执行任务 sync Serial
异步+并发队列 = 有开启新线程,并发执行任务 async Concurrent
异步+串行队列 = 有开启新线程(1条),串行执行任务 async Serial
同步+主队列 = 主线程调用:死锁 其他线程:没有开启新线程,串行执行任务
异步+主队列 = 没有开启新线程,串行执行任务
同步+并发队列(没有开启新线程,串行执行任务)
- (void)syncConcurrent {
dispatch_queue_t queue = dispatch_queue_create("syncConcurrent", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(queue, ^{
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];//模拟耗时操作
NSLog(@"1--%@",[NSThread currentThread]);
}
});
dispatch_sync(queue, ^{
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"2--%@",[NSThread currentThread]);
}
});
dispatch_sync(queue, ^{
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"3--%@",[NSThread currentThread]);
}
});
NSLog(@"end");
}
同步+串行(没有开启新线程,串行执行任务)
- (void)syncSerial {
dispatch_queue_t queue = dispatch_queue_create("syncSerial", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"1--%@",[NSThread currentThread]);
}
});
dispatch_sync(queue, ^{
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"2--%@",[NSThread currentThread]);
}
});
dispatch_sync(queue, ^{
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"3--%@",[NSThread currentThread]);
}
});
NSLog(@"end");
}
异步+并发(可开启多个线程,任务交替(同时)执行)
- (void)asyncConcurrent {
dispatch_queue_t queue = dispatch_queue_create("asyncConcurrent", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"1--%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"2--%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"3--%@",[NSThread currentThread]);
}
});
NSLog(@"end");
}
异步+串行(有开启新线程(1条),串行执行任务)
- (void)asyncSerial {
dispatch_queue_t queue = dispatch_queue_create("asyncSerial", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"1--%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"2--%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"3--%@",[NSThread currentThread]);
}
});
NSLog(@"end");
}
同步执行+主队列(主线程调用:死锁)
- (void)syncMain {
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"1--%@",[NSThread currentThread]);
}
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"2--%@",[NSThread currentThread]);
}
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"3--%@",[NSThread currentThread]);
}
});
NSLog(@"end");
}
同步执行+主队列(其他线程调用:没有开启新线程,串行执行任务)
- (void)syncMain2 {
[NSThread detachNewThreadSelector:@selector(syncMain) toTarget:self withObject:nil];
}
异步执行+主队列(只在主线程中执行任务,执行完一个任务,再执行下一个任务)
- (void)asyncMain {
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_async(queue, ^{
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"1--%@",[NSThread currentThread]);
}
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"2--%@",[NSThread currentThread]);
}
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"3--%@",[NSThread currentThread]);
}
});
NSLog(@"end");
}
GCD线程间的通信
- (void)communication {
//全局并发队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(queue, ^{
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"1--%@",[NSThread currentThread]);
}
//回主线程
dispatch_async(mainQueue, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"2--%@",[NSThread currentThread]);
});
});
}
栅栏方法 dispatch_barrier_async
- (void)barrier {
dispatch_queue_t queue = dispatch_queue_create("testQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"1--%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"2--%@",[NSThread currentThread]);
}
});
dispatch_barrier_async(queue, ^{
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"barrier--%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"3--%@",[NSThread currentThread]);
}
});
dispatch_async(queue, ^{
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"4--%@",[NSThread currentThread]);
}
});
}
GCD延时执行方法: dispatch_after
- (void)after {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//3秒后执行
NSLog(@"after---%@",[NSThread currentThread]);
});
}
GCD一次性代码
-(void)once {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//只执行一次的代码(这里默认是线程安全的)
});
}
GCD快速迭代
-(void)apply {
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
NSLog(@"apply begin");
dispatch_apply(6, queue, ^(size_t index) {
NSLog(@"%zd---%@",index, [NSThread currentThread]);
});
NSLog(@"apple end");
}
GCD队列组 dispatch_group
dispatch_group_notify(监听group中任务完成的状态,当所有的任务都执行完成后,追加任务到group中,并执行任务)
- (void)groupNotify {
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"1--%@",[NSThread currentThread]);
}
});
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"2--%@",[NSThread currentThread]);
}
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"3--%@",[NSThread currentThread]);
}
});
}
dispatch_group_wait(暂停(阻塞)当前线程,等待指定的group中的任务执行完成后,才会往下继续执行)
- (void)groupWait {
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"1--%@",[NSThread currentThread]);
}
});
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"2--%@",[NSThread currentThread]);
}
});
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"group---end");
}
线程安全,使用semaphore加锁
- (void)initTicketStatusSave {
semaphoreLock = dispatch_semaphore_create(1);
self.ticketCount = 100;
dispatch_queue_t queue1 = dispatch_queue_create("queue1", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t queue2 = dispatch_queue_create("queue2", DISPATCH_QUEUE_SERIAL);
__weak typeof(self) weakSelf = self;
dispatch_async(queue1, ^{
[weakSelf saleTicketNotSafe];
});
dispatch_async(queue2, ^{
[weakSelf saleTicketNotSafe];
});
}
- (void)saleTicketSafe {
while (1) {
//加锁
dispatch_semaphore_wait(semaphoreLock, DISPATCH_TIME_FOREVER);
if (self.ticketCount > 0) {
self.ticketCount--;
NSLog(@"%@",[NSString stringWithFormat:@"剩余票数 %ld 窗口:%@",(long)self.ticketCount,[NSThread currentThread]]);
} else {
NSLog(@"所有票已售完");
//相当于解锁
dispatch_semaphore_signal(semaphoreLock);
break;
}
//相当于解锁
dispatch_semaphore_signal(semaphoreLock);
}
}