美文网首页
多线程(二)

多线程(二)

作者: dandelionYD | 来源:发表于2019-04-12 09:29 被阅读0次

    上篇多线程(一)我们基本看了多线程的使用,下面我们再来看看具体的使用和一些需要注意的点
    代码详见 gitHub_Demo


    死锁的问题

    // 问题:以下代码是在主线程执行的,会不会产生死锁?会!
    - (void)test1{
        NSLog(@"执行任务1");
        dispatch_queue_t queue = dispatch_get_main_queue();
        dispatch_sync(queue, ^{
            NSLog(@"执行任务2");
        });
        NSLog(@"执行任务3");
    }
    
    Multithreading_09.png
    //开启一个新的串行队列,此时执行不会造成死锁
    -(void)test2{
        NSLog(@"执行任务1");
        dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL);
        dispatch_sync(queue, ^{
            NSLog(@"执行任务2");
        });
        NSLog(@"执行任务3");
    }
    
    打印:
    Multithreading[29726:1607533] 执行任务1
    Multithreading[29726:1607533] 执行任务2
    Multithreading[29726:1607533] 执行任务3
    
    Multithreading_10.png
    //问题:以下代码是在主线程执行的,会不会产生死锁?不会!(dispatch_async不要求立马在当前线程同步执行任务)
    -(void)test3{
        NSLog(@"执行任务1");
        dispatch_queue_t queue = dispatch_get_main_queue();
        dispatch_async(queue, ^{
            NSLog(@"执行任务2");
        });
        sleep(3);
        NSLog(@"执行任务3");
    }
    打印:
    Multithreading[30355:1689772] 执行任务1
    Multithreading[30355:1689772] 执行任务3
    Multithreading[30355:1689772] 执行任务2
    
    Multithreading_11.png
    // 问题:以下代码是在主线程执行的,会不会产生死锁?会!
    -(void)test4{
        NSLog(@"执行任务1");
        dispatch_queue_t queue = dispatch_queue_create("myqueu", DISPATCH_QUEUE_SERIAL);
        dispatch_async(queue, ^{ // block0
                NSLog(@"执行任务2");
                dispatch_sync(queue, ^{ // block1
                    NSLog(@"执行任务3");
                });
                NSLog(@"执行任务4");
        });
        NSLog(@"执行任务5");
    }
    
    Multithreading_12.png
    // 问题:以下代码是在主线程执行的,会不会产生死锁?不会!
    -(void)test5{
        NSLog(@"执行任务1");
        dispatch_queue_t queue = dispatch_queue_create("myqueu", DISPATCH_QUEUE_SERIAL);
        dispatch_queue_t queue2 = dispatch_queue_create("myqueu2", DISPATCH_QUEUE_SERIAL);
        dispatch_async(queue, ^{ // 0
            NSLog(@"执行任务2");
            dispatch_sync(queue2, ^{ // 1
                NSLog(@"执行任务3");
            });
            NSLog(@"执行任务4");
        });
        NSLog(@"执行任务5");
    }
    
    Multithreading_13.png
    // 问题:以下代码是在主线程执行的,会不会产生死锁?不会!
    -(void)test6{
        NSLog(@"执行任务1");
        NSLog(@"%@",[NSThread currentThread]);
        dispatch_queue_t queue = dispatch_queue_create("myqueu", DISPATCH_QUEUE_CONCURRENT);
        dispatch_async(queue, ^{
            NSLog(@"%@",[NSThread currentThread]);
            NSLog(@"执行任务2");
            dispatch_sync(queue, ^{
                NSLog(@"%@",[NSThread currentThread]);
                NSLog(@"执行任务3");
            });
            NSLog(@"执行任务4");
        });
        NSLog(@"执行任务5");
    }
    
    Multithreading_14.png

    队列组的使用

    需求:并发执行 任务1、任务2 等这2个任务结束后,执行任务3

    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        // 创建队列组
        dispatch_group_t group = dispatch_group_create();
        // 创建并发队列
        dispatch_queue_t queue = dispatch_queue_create("my_queue", DISPATCH_QUEUE_CONCURRENT);
        
        // 添加异步任务
        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, ^{
            for (int i = 0; i < 5; i++) {
                NSLog(@"任务3-%@", [NSThread currentThread]);
            }
        });
        
        dispatch_group_notify(group, queue, ^{
            for (int i = 0; i < 5; i++) {
                NSLog(@"任务4-%@", [NSThread currentThread]);
            }
        });
        //此时3 4 是并发执行的
    }
    

    友情链接:

    相关文章

      网友评论

          本文标题:多线程(二)

          本文链接:https://www.haomeiwen.com/subject/nydqwqtx.html