美文网首页
Serial Dispath Queue 和 Concurren

Serial Dispath Queue 和 Concurren

作者: 骑着毛驴走起来 | 来源:发表于2018-03-17 18:04 被阅读58次

    Dispatch Queues的生成可以有这几种方式:              1. dispatch_queue_t queue = dispatch_queue_create("com.dispatch.serial", DISPATCH_QUEUE_SERIAL);       //生成一个串行队列,队列中的block按照先进先出(FIFO)的顺序去执行,实际上为单线程执行。第一个参数是队列的名称,在调试程序时会非常有用,所有尽量不要重名了。  2. dispatch_queue_t queue = dispatch_queue_create("com.dispatch.concurrent", DISPATCH_QUEUE_CONCURRENT);       //生成一个并发执行队列,block被分发到多个线程去执行  3. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);      //获得程序进程缺省产生的并发队列,可设定优先级来选择高、中、低三个优先级队列。由于是系统默认生成的,所以无法调用dispatch_resume()和dispatch_suspend()来控制执行继续或中断。需要注意的是,三个队列不代表三个线程,可能会有更多的线程。并发队列可以根据实际情况来自动产生合理的线程数,也可理解为dispatch队列实现了一个线程池的管理,对于程序逻辑是透明的。  官网文档解释说共有三个并发队列,但实际还有一个更低优先级的队列,设置优先级为DISPATCH_QUEUE_PRIORITY_BACKGROUND。Xcode调试时可以观察到正在使用的各个dispatch队列。4. dispatch_queue_t queue = dispatch_get_main_queue();         //获得主线程的dispatch队列,实际是一个串行队列。同样无法控制主线程dispatch队列的执行继续或中断。   

        NSLog(@"1");

        dispatch_async(dispatch_get_main_queue(), ^{

             NSLog(@"2");

        });

        NSLog(@"3"); //输出为 1,3,2

        NSLog(@"4");

        dispatch_sync(dispatch_get_main_queue(), ^{

             NSLog(@"5");

        });

        NSLog(@"6"); //输出为 4 ,程序会崩溃,Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

        //同步执行block,函数不返回,一直等到block执行完毕。编译器会根据实际情况优化代码,所以有时候你会发现block其实还在当前线程上执行,并没用产生新线程

    相关文章

      网友评论

          本文标题:Serial Dispath Queue 和 Concurren

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