iosiOS开发多线程GCD


  什么是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条新的线程,并行开多个线程。开多少条线程由系统决定。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值