GCDのシリアルキューとパラレルキュー
4819 ワード
GCDには3つのキュータイプがあります. The main queue:プライマリスレッド機能と同じです.シリアルキューです. Global queues:グローバルキューは同時キューであり、プロセス全体で共有されます.プロセスには、高、中(デフォルト)、低、バックグラウンドの4つのグローバルキューがあります.優先度: ユーザーキュー:ユーザーキューはシリアル作成:
global_Queueはグローバル同時キュー、すなわちglobal_に参加するQueueのコードブロックはすぐにglobal_で次のコードを実行します.Queueに2つのコードブロックを前後して追加
実行結果:
2つのコードブロックが同時実行であることがわかります
user_Queueはユーザーが作成したシリアルキューで、ユーザーがこのキューに参加したコードブロックはキューに参加した時間によって前後して実行され、現在のコードがすぐに実行されてから、次のコードブロックは次のコードを実行します.
実行結果:
同時スレッドでは、ログ1が最初にキューに追加され、実行が完了するとログ2が実行されます.
さらにログ1に遅延を追加
実行結果:
遅延を追加すると、ログ1はログ2より後にキューに追加され、ログ2が実行された後にログ1が実行されます.
私は1つのQQ群を創建して、みんながインターネットの開放的な心理状態に基づいて、出会った問題と経験を群の中で分かち合って、みんなが互いに心得を交流して、共に向上することを望みます.グループ番号:77311380
#define DISPATCH_QUEUE_PRIORITY_HIGH 2
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0
#define DISPATCH_QUEUE_PRIORITY_LOW (-2)
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
//main_queue
dispatch_queue_t GCDQueue = dispatch_get_main_queue();
//global_queue
dispatch_queue_t GCDQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//user_queue
dispatch_queue_t GCDQueue = dispatch_queue_create("com.test.gcd", NULL);
global_Queueはグローバル同時キュー、すなわちglobal_に参加するQueueのコードブロックはすぐにglobal_で次のコードを実行します.Queueに2つのコードブロックを前後して追加
-(void)test {
dispatch_queue_t GCDQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(GCDQueue, ^{
NSLog(@"111111111111");
NSLog(@"111111111111");
NSLog(@"111111111111");
NSLog(@"111111111111");
NSLog(@"111111111111");
});
dispatch_async(GCDQueue, ^{
NSLog(@"22222222222222");
NSLog(@"22222222222222");
NSLog(@"22222222222222");
NSLog(@"22222222222222");
NSLog(@"22222222222222");
NSLog(@"22222222222222");
});
}
実行結果:
2014-03-10 22:51:09.498 gcdtest[18010:4207] 22222222222222
2014-03-10 22:51:09.498 gcdtest[18010:1103] 111111111111
2014-03-10 22:51:09.501 gcdtest[18010:4207] 22222222222222
2014-03-10 22:51:09.501 gcdtest[18010:1103] 111111111111
2014-03-10 22:51:09.501 gcdtest[18010:4207] 22222222222222
2014-03-10 22:51:09.502 gcdtest[18010:1103] 111111111111
2014-03-10 22:51:09.502 gcdtest[18010:4207] 22222222222222
2014-03-10 22:51:09.503 gcdtest[18010:4207] 22222222222222
2014-03-10 22:51:09.503 gcdtest[18010:1103] 111111111111
2014-03-10 22:51:09.504 gcdtest[18010:4207] 22222222222222
2014-03-10 22:51:09.504 gcdtest[18010:1103] 111111111111
2つのコードブロックが同時実行であることがわかります
user_Queueはユーザーが作成したシリアルキューで、ユーザーがこのキューに参加したコードブロックはキューに参加した時間によって前後して実行され、現在のコードがすぐに実行されてから、次のコードブロックは次のコードを実行します.
-(void)test{
dispatch_queue_t userQueue = dispatch_queue_create("com.test.gcd", DISPATCH_QUEUE_SERIAL);
dispatch_async(userQueue,^{
NSLog(@"111111111111");
NSLog(@"111111111111");
NSLog(@"111111111111");
});
dispatch_async(userQueue,^{
NSLog(@"22222222222222");
NSLog(@"22222222222222");
NSLog(@"22222222222222");
NSLog(@"22222222222222");
});
}
実行結果:
2014-03-10 22:56:55.928 gcdtest[18046:1c03] 111111111111
2014-03-10 22:56:55.929 gcdtest[18046:1c03] 111111111111
2014-03-10 22:56:55.929 gcdtest[18046:1c03] 111111111111
2014-03-10 22:56:55.930 gcdtest[18046:1c03] 22222222222222
2014-03-10 22:56:55.930 gcdtest[18046:1c03] 22222222222222
2014-03-10 22:56:55.930 gcdtest[18046:1c03] 22222222222222
2014-03-10 22:56:55.930 gcdtest[18046:1c03] 22222222222222
同時スレッドでは、ログ1が最初にキューに追加され、実行が完了するとログ2が実行されます.
さらにログ1に遅延を追加
-(void)test{
__block dispatch_queue_t userQueue = dispatch_queue_create("com.test.gcd", NULL);
dispatch_queue_t GCDQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(GCDQueue, ^{
[NSThread sleepForTimeInterval:2.0f];
dispatch_async(userQueue,^{
NSLog(@"111111111111");
NSLog(@"111111111111");
NSLog(@"111111111111");
});
});
dispatch_async(GCDQueue, ^{
dispatch_async(userQueue,^{
NSLog(@"22222222222222");
NSLog(@"22222222222222");
NSLog(@"22222222222222");
NSLog(@"22222222222222");
});
});
}
実行結果:
2014-03-10 22:58:16.991 gcdtest[18066:1103] 22222222222222
2014-03-10 22:58:16.992 gcdtest[18066:1103] 22222222222222
2014-03-10 22:58:16.993 gcdtest[18066:1103] 22222222222222
2014-03-10 22:58:16.993 gcdtest[18066:1103] 22222222222222
2014-03-10 22:58:19.066 gcdtest[18066:1903] 111111111111
2014-03-10 22:58:19.066 gcdtest[18066:1903] 111111111111
2014-03-10 22:58:19.067 gcdtest[18066:1903] 111111111111
遅延を追加すると、ログ1はログ2より後にキューに追加され、ログ2が実行された後にログ1が実行されます.
私は1つのQQ群を創建して、みんながインターネットの開放的な心理状態に基づいて、出会った問題と経験を群の中で分かち合って、みんなが互いに心得を交流して、共に向上することを望みます.グループ番号:77311380