通过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个线程。
过多使用线程,就会消耗大量内存,引起大量的上下文切换,大幅度降低系统的响应性能。