什么是GCD?
它是苹果为多核的并行运算提出的解决方案
GCD 有什么用
它可以自动创建线程、调度任务、销毁线程等
GCD怎么用
首先我们先说下 GCD中的队列和任务
任务
1:同步执行:该队列下的代码会在当前线程执行,如果当前代码没执行完,会阻塞当前线程,执行完了再执行下面的代码。
2:异步执行:会在另外一条或多条线程中执行任务,不会阻塞当前线程
队列
1:串行队列:一个任务做完了再开始下一个任务
2:并行队列:多个任务同时并发进行
代码来看看
串行异步执行
//OBJECTIVE-C
//创建一个串行的队列
dispatch_queue_t queue = dispatch_queue_create("serial", DISPATCH_QUEUE_SERIAL);
NSLog(@"开始--%@",[NSThread currentThread]);
//异步执行
dispatch_async(queue, ^{
for (int i = 0; i<10; i++) {
NSLog(@"task ---%@",[NSThread currentThread]);
}
});
NSLog(@"结束--%@",[NSThread currentThread]);
//swift3.0
//创建队列
let queue = DispatchQueue(label: "serial")
print("开始" + "\(Thread.current)")
//异步执行
for _ in 1...10 {
queue.async {
print("task" + "\(Thread.current) + q: \(queue)")
}
}
print("结束" + "\(Thread.current)")
我们来看下结果
可以看出开了一条新的线程,并没有在主线程中执行任务,没有阻塞主线程
串行同步执行
//OBJECTIVE-C
//创建一个串行的队列
dispatch_queue_t queue = dispatch_queue_create("serial", DISPATCH_QUEUE_SERIAL);
NSLog(@"开始--%@",[NSThread currentThread]);
//同步执行
dispatch_sync(queue, ^{
for (int i = 0; i<10; i++) {
NSLog(@"task ---%@",[NSThread currentThread]);
}
});
NSLog(@"结束--%@",[NSThread currentThread]);
//swift3.0
//创建队列
let queue = DispatchQueue(label: "serial")
print("开始" + "\(Thread.current)")
//同步执行
for _ in 1...10 {
queue.sync {
print("task" + "\(Thread.current) + q: \(queue)")
}
}
print("结束" + "\(Thread.current)")
来看下结果
可以看出,串行同步并没有开新的线程,全部是在主线程中执行任务,所以:"结束"肯定是在最后出现。
并行同步:
//OBJECTIVE-C
//创建一个并行的队列
dispatch_queue_t queue = dispatch_queue_create("concurrent", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"开始--%@",[NSThread currentThread]);
//同步执行
dispatch_sync(queue, ^{
for (int i = 0; i<10; i++) {
NSLog(@"task ---%@",[NSThread currentThread]);
}
});
NSLog(@"结束--%@",[NSThread currentThread]);
//swift3.0
//创建并行队列
let queue = DispatchQueue(label: "concurrent", attributes: .concurrent, target: nil)
print("开始" + "\(Thread.current)")
//同步执行
for _ in 1...10 {
queue.sync {
print("task" + "\(Thread.current) + q: \(queue)")
}
}
print("结束" + "\(Thread.current)")
打印的结果是
并没有开新的线程,并且在主线程同步执行
最后的并行异步
//OBJECTIVE-C
//创建一个并行的队列
dispatch_queue_t queue = dispatch_queue_create("serial", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"开始--%@",[NSThread currentThread]);
//异步执行
dispatch_async(queue, ^{
for (int i = 0; i<10; i++) {
NSLog(@"task ---%@",[NSThread currentThread]);
}
});
NSLog(@"结束--%@",[NSThread currentThread]);
//swift3.0
//创建并行队列
let queue = DispatchQueue(label: "concurrent", attributes: .concurrent, target: nil)
print("开始" + "\(Thread.current)")
//异步执行
for _ in 1...10 {
queue.async {
print("task" + "\(Thread.current) + q: \(queue)")
}
}
print("结束" + "\(Thread.current)")
打印的结果是
从图中红色部分可以看出,新开了多条线程,异步执行,结束并不是在最后。
结论:任务同步执行,不管是串行还是并行都不开新的线程。
任务异步执行,串行开1条新的线程,并行开多个线程。开多少条线程由系统决定。