dispatch_queue_create函数生成的派发队列不管是
Serial Dispatch queue
还是Concurrent Dispatch Queue
都使用与默认优先级Global Dispatch Queue
相同执行优先级的线程。
我们可以通过dispatch_set_target_queue函数变更生成的派发队列的优先级,代码如下:
#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"
#define C_QUEUE @"come.test.c.queue"
@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);
dispatch_queue_t testQueue4=dispatch_queue_create(C_QUEUE, DISPATCH_QUEUE_CONCURRENT);
//[self testQueueC:testQueue4];
dispatch_set_target_queue(testQueue1, testQueue);
dispatch_set_target_queue(testQueue2, testQueue);
dispatch_set_target_queue(testQueue3, testQueue);
dispatch_set_target_queue(testQueue4, testQueue);
[self testQueue0:testQueue];
[self testQueue1:testQueue1];
[self testQueue2:testQueue2];
[self testQueue3:testQueue3];
}
dispatch_set_target_queue 的第一个参数是 指定要变更执行优先级的派发队列(被改变优先级的队列)
dispatch_set_target_queue 的第二个参数是 要使用的执行优先级相同优先级的队列(目标优先级的队列,即参照的对象)
注意:
如果在多个Serial dispatch queue中用dispatch_set_target_queue函数指定目标为某一个Serial dispatch queue,那么原来本该并行执行的多个Serial dispatch queue,在目标 派发队列上只能同时执行一个处理。
因此,在必须将不可并行执行的处理追加到多个Serial dispatch queue中时,可以使用dispatch_set_target_queue函数将目标指定为某一个Serial dispatch queue,即可防止并行执行。
执行顺序,最最最原始的,肯定是讲究先来后到的,先来先服务
这种改变优先级的,把Serial dispatch queue 银行窗口前的队伍,多个窗口,多个队伍,每个队伍是并行的,但是每个队伍中的每个办理业务的人的任务执行顺序,还是先来先服务的操作
如果所有的队伍都要求同某个队伍保持相同的优先级,那只能恢复队伍层面的先来先服务了,只能把这些完全变成串行。
我们看一下代码:
#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"
#define C_QUEUE @"come.test.c.queue"
@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);
dispatch_queue_t testQueue4=dispatch_queue_create(C_QUEUE, DISPATCH_QUEUE_CONCURRENT);
//[self testQueueC:testQueue4];
dispatch_set_target_queue(testQueue1, testQueue);
dispatch_set_target_queue(testQueue2, testQueue);
dispatch_set_target_queue(testQueue3, testQueue);
dispatch_set_target_queue(testQueue4, testQueue);
[self testQueue0:testQueue];
[self testQueue1:testQueue1];
[self testQueue2:testQueue2];
[self testQueue3:testQueue3];
}
-(void)testQueueC:(dispatch_queue_t)testQueue{
dispatch_async(testQueue, ^(){
NSLog(@"细");
});
dispatch_async(testQueue, ^(){
NSLog(@"草");
});
dispatch_async(testQueue, ^(){
NSLog(@"微");
});
dispatch_async(testQueue, ^(){
NSLog(@"风");
});
dispatch_async(testQueue, ^(){
NSLog(@"岸");
});
}
-(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(@"啊");
});
}
我们看一下执行结果:
020-08-23 00:11:51.150919+0800 gcd0[17626:712034] 0
2020-08-23 00:11:51.151061+0800 gcd0[17626:712034] 1
2020-08-23 00:11:51.151203+0800 gcd0[17626:712034] 2
2020-08-23 00:11:51.151342+0800 gcd0[17626:712034] 3
2020-08-23 00:11:51.151502+0800 gcd0[17626:712034] 4
2020-08-23 00:11:51.151622+0800 gcd0[17626:712034] 5
2020-08-23 00:11:51.151756+0800 gcd0[17626:712034] a
2020-08-23 00:11:51.151883+0800 gcd0[17626:712034] b
2020-08-23 00:11:51.151992+0800 gcd0[17626:712034] c
2020-08-23 00:11:51.152106+0800 gcd0[17626:712034] d
2020-08-23 00:11:51.152400+0800 gcd0[17626:712034] e
2020-08-23 00:11:51.152828+0800 gcd0[17626:712034] f
2020-08-23 00:11:51.153216+0800 gcd0[17626:712034] A
2020-08-23 00:11:51.153570+0800 gcd0[17626:712034] B
2020-08-23 00:11:51.154188+0800 gcd0[17626:712034] C
2020-08-23 00:11:51.154834+0800 gcd0[17626:712034] D
2020-08-23 00:11:51.155336+0800 gcd0[17626:712034] E
2020-08-23 00:11:51.155711+0800 gcd0[17626:712034] F
2020-08-23 00:11:51.156198+0800 gcd0[17626:712034] 海
2020-08-23 00:11:51.156767+0800 gcd0[17626:712034] 内
2020-08-23 00:11:51.157366+0800 gcd0[17626:712034] 存
2020-08-23 00:11:51.157736+0800 gcd0[17626:712034] 知
2020-08-23 00:11:51.158654+0800 gcd0[17626:712034] 己
2020-08-23 00:11:51.158932+0800 gcd0[17626:712034] 啊
即使执行多次,顺序也不会改变,