GCD笔记2->派发队列的创建->0

 

通过GCD的API生成派发队列

通过dispatch_queue_create 函数可以生成派发队列,以下源代码生成了serial Dispatch Queue


#define TEST_QUEUE @"com.test.queue0"
dispatch_queue_t testQueue=dispatch_queue_create(TEST_QUEUE,NULL);
    dispatch_async(testQueue, ^(){
        NSLog(@"0");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"1");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"2");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"3");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"4");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"5");
    });

其执行结果:

2020-08-22 15:19:30.809838+0800 gcd0[10612:396291] 0
2020-08-22 15:19:30.809986+0800 gcd0[10612:396291] 1
2020-08-22 15:19:30.810100+0800 gcd0[10612:396291] 2
2020-08-22 15:19:30.810235+0800 gcd0[10612:396291] 3
2020-08-22 15:19:30.810347+0800 gcd0[10612:396291] 4
2020-08-22 15:19:30.810448+0800 gcd0[10612:396291] 5

dispatch_queue_create 函数可以生成仁义多个派发队列,当生成多个serial Dispatch Queue时,各个serial Dispatch Queue将并行执行,虽然,在1个serial Dispatch Queue中同时只能执行1个追加处理,但是如果将处理分别追加到4个serial Dispatch Queue

中,各个serial Dispatch Queue执行1个,即为同时执行4个处理。

我们写一下代码:

#import "ViewController.h"
#define MAX_NUMBER 10000
#define TEST_QUEUE @"com.test.queue0"
#define TEST_QUEUE1 @"com.test.queue1"
#define TEST_QUEUE2 @"com.test.queue2"
#define TEST_QUEUE3 @"com.test.queue3"
#define TEST_QUEUE4 @"com.test.queue4"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    dispatch_queue_t testQueue=dispatch_queue_create(TEST_QUEUE,NULL);
    dispatch_queue_t testQueue1=dispatch_queue_create(TEST_QUEUE1,NULL);
    dispatch_queue_t testQueue2=dispatch_queue_create(TEST_QUEUE2,NULL);
    dispatch_queue_t testQueue3=dispatch_queue_create(TEST_QUEUE3,NULL);
    [self testQueue0:testQueue];
    [self testQueue1:testQueue1];
    [self testQueue2:testQueue2];
    [self testQueue3:testQueue3];
    
     
    
}
-(void)testQueue0:(dispatch_queue_t)testQueue{
   dispatch_async(testQueue, ^(){
        NSLog(@"0");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"1");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"2");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"3");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"4");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"5");
    });
}
-(void)testQueue1:(dispatch_queue_t)testQueue{
   dispatch_async(testQueue, ^(){
        NSLog(@"a");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"b");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"c");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"d");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"e");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"f");
    });
}
-(void)testQueue2:(dispatch_queue_t)testQueue{
   dispatch_async(testQueue, ^(){
        NSLog(@"A");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"B");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"C");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"D");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"E");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"F");
    });
}
-(void)testQueue3:(dispatch_queue_t)testQueue{
   dispatch_async(testQueue, ^(){
        NSLog(@"海");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"内");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"存");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"知");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"己");
    });
    dispatch_async(testQueue, ^(){
        NSLog(@"啊");
    });
}

@end

我们看一下执行结果1:

2020-08-22 15:44:51.595323+0800 gcd0[10918:414097] 0
2020-08-22 15:44:51.595337+0800 gcd0[10918:414098] a
2020-08-22 15:44:51.595367+0800 gcd0[10918:414100] 海
2020-08-22 15:44:51.595342+0800 gcd0[10918:414102] A
2020-08-22 15:44:51.595487+0800 gcd0[10918:414098] b
2020-08-22 15:44:51.595493+0800 gcd0[10918:414097] 1
2020-08-22 15:44:51.595522+0800 gcd0[10918:414100] 内
2020-08-22 15:44:51.595523+0800 gcd0[10918:414102] B
2020-08-22 15:44:51.595608+0800 gcd0[10918:414098] c
2020-08-22 15:44:51.595624+0800 gcd0[10918:414097] 2
2020-08-22 15:44:51.595652+0800 gcd0[10918:414100] 存
2020-08-22 15:44:51.595857+0800 gcd0[10918:414102] C
2020-08-22 15:44:51.596119+0800 gcd0[10918:414098] d
2020-08-22 15:44:51.596310+0800 gcd0[10918:414102] D
2020-08-22 15:44:51.596507+0800 gcd0[10918:414098] e
2020-08-22 15:44:51.596718+0800 gcd0[10918:414102] E
2020-08-22 15:44:51.596930+0800 gcd0[10918:414098] f
2020-08-22 15:44:51.597164+0800 gcd0[10918:414102] F
2020-08-22 15:44:51.598108+0800 gcd0[10918:414100] 知
2020-08-22 15:44:51.598566+0800 gcd0[10918:414097] 3
2020-08-22 15:44:51.598996+0800 gcd0[10918:414100] 己
2020-08-22 15:44:51.599235+0800 gcd0[10918:414097] 4
2020-08-22 15:44:51.599469+0800 gcd0[10918:414100] 啊
2020-08-22 15:44:51.599876+0800 gcd0[10918:414097] 5

我们再执行一次,看看结果:

2020-08-22 15:47:17.514786+0800 gcd0[10941:416462] 0
2020-08-22 15:47:17.514801+0800 gcd0[10941:416459] a
2020-08-22 15:47:17.514813+0800 gcd0[10941:416461] A
2020-08-22 15:47:17.514864+0800 gcd0[10941:416460] 海
2020-08-22 15:47:17.514957+0800 gcd0[10941:416459] b
2020-08-22 15:47:17.514964+0800 gcd0[10941:416462] 1
2020-08-22 15:47:17.515004+0800 gcd0[10941:416461] B
2020-08-22 15:47:17.515035+0800 gcd0[10941:416460] 内
2020-08-22 15:47:17.515054+0800 gcd0[10941:416459] c
2020-08-22 15:47:17.515085+0800 gcd0[10941:416462] 2
2020-08-22 15:47:17.515096+0800 gcd0[10941:416461] C
2020-08-22 15:47:17.515396+0800 gcd0[10941:416460] 存
2020-08-22 15:47:17.515649+0800 gcd0[10941:416459] d
2020-08-22 15:47:17.515921+0800 gcd0[10941:416460] 知
2020-08-22 15:47:17.516227+0800 gcd0[10941:416459] e
2020-08-22 15:47:17.516515+0800 gcd0[10941:416460] 己
2020-08-22 15:47:17.516749+0800 gcd0[10941:416459] f
2020-08-22 15:47:17.517180+0800 gcd0[10941:416460] 啊
2020-08-22 15:47:17.518131+0800 gcd0[10941:416461] D
2020-08-22 15:47:17.518430+0800 gcd0[10941:416462] 3
2020-08-22 15:47:17.518679+0800 gcd0[10941:416461] E
2020-08-22 15:47:17.518924+0800 gcd0[10941:416462] 4
2020-08-22 15:47:17.519138+0800 gcd0[10941:416461] F
2020-08-22 15:47:17.519381+0800 gcd0[10941:416462] 5

再来一次:

2020-08-22 15:47:48.513779+0800 gcd0[10953:417213] 0
2020-08-22 15:47:48.513792+0800 gcd0[10953:417211] A
2020-08-22 15:47:48.513814+0800 gcd0[10953:417208] a
2020-08-22 15:47:48.513832+0800 gcd0[10953:417210] 海
2020-08-22 15:47:48.513937+0800 gcd0[10953:417213] 1
2020-08-22 15:47:48.513963+0800 gcd0[10953:417208] b
2020-08-22 15:47:48.513983+0800 gcd0[10953:417210] 内
2020-08-22 15:47:48.514005+0800 gcd0[10953:417211] B
2020-08-22 15:47:48.514042+0800 gcd0[10953:417213] 2
2020-08-22 15:47:48.514085+0800 gcd0[10953:417208] c
2020-08-22 15:47:48.514115+0800 gcd0[10953:417210] 存
2020-08-22 15:47:48.514373+0800 gcd0[10953:417211] C
2020-08-22 15:47:48.514579+0800 gcd0[10953:417213] 3
2020-08-22 15:47:48.514765+0800 gcd0[10953:417211] D
2020-08-22 15:47:48.514977+0800 gcd0[10953:417213] 4
2020-08-22 15:47:48.515205+0800 gcd0[10953:417211] E
2020-08-22 15:47:48.515453+0800 gcd0[10953:417213] 5
2020-08-22 15:47:48.515655+0800 gcd0[10953:417211] F
2020-08-22 15:47:48.516788+0800 gcd0[10953:417210] 知
2020-08-22 15:47:48.517026+0800 gcd0[10953:417208] d
2020-08-22 15:47:48.517420+0800 gcd0[10953:417210] 己
2020-08-22 15:47:48.517614+0800 gcd0[10953:417208] e
2020-08-22 15:47:48.517838+0800 gcd0[10953:417210] 啊
2020-08-22 15:47:48.518109+0800 gcd0[10953:417208] f

我们可以看出,虽然每次结果都不同,但是在serial Dispatch Queue中的顺序没有改变(如输出数组0到5,小写字母a到e,大写字母A到E,汉字序列“海内存知己啊”)

一旦生成serial Dispatch Queue并追加处理,系统对于一个serial Dispatch Queue就只生成并使用一个线程,如果生成2000个serial Dispatch Queue,那么就生成2000个线程。

过多使用线程,就会消耗大量内存,引起大量的上下文切换,大幅度降低系统的响应性能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值