美文网首页
同步、异步与队列

同步、异步与队列

作者: 精神病患者link常 | 来源:发表于2018-03-09 17:22 被阅读19次

    原文章地址

    #pragma mark  -- 主队列
    
    /*
     主线程执行同步任务会死锁:同步任务在添加进线程后就要当即执行
     但是当前主线程正在执行text1函数,text1函数执行完成需要等待每一个顺序语句完成。
     所以发生了相互等待产生了死锁。
     */
    -(void)test1{
        NSLog(@"start---%@",[NSThread currentThread]);
        dispatch_queue_t mainQue = dispatch_get_main_queue();
        dispatch_sync(mainQue, ^{
            printf("2222\n");
        });
        NSLog(@"end---%@",[NSThread currentThread]);
    }
    
    image.png
    /**
     主线成执行异步任务:不会开新的线程,会在主线程依次执行任务。
     主队列添加完成block以后直接返回,主队列是顺序添加的block
     */
    -(void)test2{
        NSLog(@"start---%@",[NSThread currentThread]);
        dispatch_queue_t mainQue = dispatch_get_main_queue();
        for (int i = 0; i<10; i++) {
            dispatch_async(mainQue, ^{
                NSLog(@"%d---%@",i,[NSThread currentThread]);
            });
        }
        NSLog(@"end---%@",[NSThread currentThread]);
    }
    
    image.png
    #pragma mark  --并发队列
    /**
     并发队列执行同步任务:不创建线程,有序的执行所有的任务。
     这些任务都是创建一个就立马执行,执行完才创建下一个。
     同步函数是不会添加线程的,并发队列与否,并不影响同步函数的创建
     因为本身就不能多创建线程,也就不存在并发。
     */
    - (void)test3{
        NSLog(@"start---%@",[NSThread currentThread]);
        dispatch_queue_t concurrentQue = dispatch_queue_create("fusheng", DISPATCH_QUEUE_CONCURRENT);
        for (int i = 0; i<10; i++) {
            dispatch_sync(concurrentQue, ^{
                NSLog(@"%d---%@",i,[NSThread currentThread]);
            });
        }
        NSLog(@"end---%@",[NSThread currentThread]);
    }
    
    image.png
    /**
     并发队列执行异步任务:创建新的线程,各个线程也是并发执行的。
     */
    - (void)test4{
        NSLog(@"start---%@",[NSThread currentThread]);
        dispatch_queue_t concurrentQue = dispatch_queue_create("fusheng", DISPATCH_QUEUE_CONCURRENT);
        for (int i = 0; i<10; i++) {
            dispatch_async(concurrentQue, ^{
                NSLog(@"%d---%@",i,[NSThread currentThread]);
            });
        }
        NSLog(@"end---%@",[NSThread currentThread]);
    }
    
    image.png
    #pragma mark  --串行队列
    /**
     串行队列执行同步任务:不会创建线程,顺序执行任务。block任务执行完成以后继续向下执行任务。
     注意:主队列虽然也是串行队列,但是会发生死锁。
     */
    - (void)test5{
        NSLog(@"start---%@",[NSThread currentThread]);
        dispatch_queue_t serialtQue = dispatch_queue_create("fusheng", DISPATCH_QUEUE_SERIAL);
        for (int i = 0; i<10; i++) {
            dispatch_sync(serialtQue, ^{
                NSLog(@"%d---%@",i,[NSThread currentThread]);
            });
        }
        NSLog(@"end---%@",[NSThread currentThread]);
    }
    
    
    image.png
    /**
     串行队列执行异步任务:开新的线程,block任务会在新线程依次执行任务。
     串行队列添加完成block以后直接返回继续执行下面的任务,串行队列是顺序添加的block
     */
    -(void)test6{
        NSLog(@"start---%@",[NSThread currentThread]);
        dispatch_queue_t serialQue = dispatch_queue_create("fusheng", DISPATCH_QUEUE_SERIAL);
        for (int i = 0; i<10; i++) {
            dispatch_async(serialQue, ^{
                NSLog(@"%d---%@",i,[NSThread currentThread]);
            });
        }
        NSLog(@"end---%@",[NSThread currentThread]);
    }
    
    image.png

    相关文章

      网友评论

          本文标题:同步、异步与队列

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