#import "ViewController.h" @interface ViewController (){ dispatch_source_t source; // dispatch_queue_t queueAll1; // dispatch_queue_t queueAll2; dispatch_queue_t queueAll; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // [self test18]; } - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ // [self test16]; // dispatch_resume(queueAll); // dispatch_suspend(queueAll1); [self test19]; } - (void)test19{ dispatch_queue_t queue = dispatch_get_main_queue(); for (int i = 0; i< 20; i++) { dispatch_async(queue, ^{ NSLog(@"%@ - %d",[NSThread currentThread],i); }); } } #pragma mark - dispatch_resume(queue); - (void)test18{ // 有效 queueAll = dispatch_queue_create("hh", NULL); // 無效 // queueAll = dispatch_queue_create("hh", DISPATCH_QUEUE_CONCURRENT); // 無效 // queueAll = dispatch_get_main_queue(); for (int i =0 ; i<10; i++) { dispatch_async(queueAll, ^{ NSLog(@"%@ - %d",[NSThread currentThread],i); }); } dispatch_suspend(queueAll); // dispatch_async(dispatch_get_global_queue(0, 0), ^{ // // for (int i =0 ; i<10; i++) { // dispatch_sync(queueAll, ^{ // // NSLog(@"%@ - %d",[NSThread currentThread],i); // }); // } // }); // dispatch_suspend(queueAll); // } #pragma mark - 串行隊列,同步執行 - (void)test16{ dispatch_queue_t queue = dispatch_queue_create("hahah", NULL); dispatch_async(dispatch_get_global_queue(0, 0), ^{ for (int i = 0; i<10; i++) { // 同步執行,是在當前線程中執行 dispatch_sync(queue, ^{ NSLog(@"%@ - %d",[NSThread currentThread],i); }); } }); } #pragma mark - 以前以後同步 - (void)test15{ dispatch_queue_t queue = dispatch_queue_create("hahah", DISPATCH_QUEUE_CONCURRENT); for (int i = 0; i<10; i++) { dispatch_async(queue, ^{ NSLog(@"111 - %@ - %d",[NSThread currentThread],i); }); } dispatch_barrier_sync(queue, ^{ NSLog(@"%@ - 2222",[NSThread currentThread]); }); for (int i = 0; i<10; i++) { dispatch_async(queue, ^{ NSLog(@"333 - %@ - %d",[NSThread currentThread],i); }); } } #pragma mark - 以前以後異步 - (void)test14{ // 必須傳DISPATCH_QUEUE_CONCURRENT,否則和dispatch_async同樣 dispatch_queue_t queue = dispatch_queue_create("kk", DISPATCH_QUEUE_CONCURRENT); // dispatch_queue_t queue = dispatch_get_global_queue(0, 0); for (int i = 0; i<10; i++) { dispatch_async(queue, ^{ NSLog(@"111 - %@ - %d",[NSThread currentThread],i); }); } dispatch_barrier_async(queue, ^{ NSLog(@"%@ - 2222",[NSThread currentThread]); }); for (int i = 0; i<10; i++) { dispatch_async(queue, ^{ NSLog(@"333 - %@ - %d",[NSThread currentThread],i); }); } } #pragma mark - 發送和等待信號 - (void)test13{ //建立一個信號,其中的參數爲信號的初始值 dispatch_semaphore_t singer = dispatch_semaphore_create(0); //發送信號,使信號量+1 dispatch_semaphore_signal(singer); //等待信號,當信號量大於0時執行後面的方法,不然等待,第二個參數爲等待的超時時長,下面設置的爲一直等待 dispatch_semaphore_wait(singer, DISPATCH_TIME_FOREVER); NSLog(@"123"); } #pragma mark - 消息傳遞機制 - (void)test12{ //建立一個數據對象,DISPATCH_SOURCE_TYPE_DATA_ADD的含義表示數據變化時相加 source = dispatch_source_create(DISPATCH_SOURCE_TYPE_DATA_ADD, 0, 0, dispatch_get_main_queue()); //建立接收數據變化的句柄 dispatch_source_set_event_handler(source, ^{ NSLog(@"%lu",dispatch_source_get_data(source)); }); //啓動 dispatch_resume(source); //設置數據 dispatch_source_merge_data(source, 2); //這步執行完以後會執行打印方法 } #pragma mark - gcd多核心 - (void)test11{ dispatch_apply(20, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t i) { NSLog(@"%@:%zu",[NSThread currentThread],i); }); NSLog(@"over %@",[NSThread currentThread]); } - (void)test10{ // Do any additional setup after loading the view, typically from a nib. //建立一個隊列組 dispatch_group_t group=dispatch_group_create(); //建立一個隊列 dispatch_queue_t queue=dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT); // dispatch_suspend(queue); //添加隊列任務到隊列組 dispatch_group_async(group, queue, ^{ for (int i=0; i<10; i++) { NSLog(@"%@:---(1)--%d",[NSThread currentThread],i); } }); dispatch_group_async(group, queue, ^{ for (int i=0; i<10; i++) { NSLog(@"%@:---(2)--%d",[NSThread currentThread],i); } }); //隊列組任務執行完後執行的任務 dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ for (int i=0; i<10; i++) { NSLog(@"over:%d",i); } }); for (int i=0; i<10; i++) { NSLog(@"%@:-fin-(3)--%d",[NSThread currentThread],i); } } #pragma mark - 隊列組 - (void)test9{ // dispatch_queue_t queue = dispatch_get_global_queue(0, 0); dispatch_group_t group = dispatch_group_create(); dispatch_queue_t queueAll1 = dispatch_queue_create("hahaha1", DISPATCH_QUEUE_CONCURRENT); dispatch_queue_t queueAll2 = dispatch_queue_create("hahaha2", DISPATCH_QUEUE_CONCURRENT); dispatch_group_async(group, queueAll1, ^{ for (int i =0 ; i<10; i++) { NSLog(@"%s - %d - %@",dispatch_queue_get_label(queueAll1),i,[NSThread currentThread]); } }); dispatch_group_async(group, queueAll2, ^{ for (int i =0 ; i<10; i++) { [NSThread sleepForTimeInterval:1.0]; NSLog(@"%s - %d - %@",dispatch_queue_get_label(queueAll2),i,[NSThread currentThread]); } }); dispatch_group_notify(group, dispatch_get_main_queue(), ^{ for (int i =0 ; i<10; i++) { NSLog(@"%s - %d - %@",dispatch_queue_get_label(dispatch_get_main_queue()),i,[NSThread currentThread]); } }); } #pragma mark - 全劇隊列 異步執行 - (void)test7{ dispatch_queue_t queue = dispatch_get_global_queue(0, 0); for (int i =0 ; i<20; i++) { dispatch_async(queue, ^{ NSLog(@"%@ - %d",[NSThread currentThread],i); }); } dispatch_suspend(queue); } #pragma mark - 主隊列 同步執行 // 死鎖 - (void)test6{ dispatch_queue_t queue = dispatch_get_main_queue(); for (int i =0 ; i<20; i++) { dispatch_sync(queue, ^{ NSLog(@"%@ - %d",[NSThread currentThread],i); }); } } #pragma mark - 主隊列 異步執行 // 在主線程中執行 - (void)test5{ dispatch_queue_t queue = dispatch_get_main_queue(); for (int i =0 ; i<20; i++) { dispatch_async(queue, ^{ NSLog(@"%@ - %d",[NSThread currentThread],i); }); } } #pragma mark - 併發隊列,同步執行 - (void)test8{ dispatch_queue_t queue = dispatch_queue_create("haha5", DISPATCH_QUEUE_CONCURRENT); for (int i = 0; i<20; i++) { dispatch_async(queue, ^{ NSLog(@"%@ - %d",[NSThread currentThread],i); }); } } #pragma mark - 併發隊列,同步執行 - (void)test4{ dispatch_queue_t queue = dispatch_queue_create("haha4", DISPATCH_QUEUE_CONCURRENT); for (int i = 0; i<20; i++) { dispatch_sync(queue, ^{ NSLog(@"%@ - %d",[NSThread currentThread],i); }); } } #pragma mark - 串行隊列,異步執行 - (void)test3{ dispatch_queue_t queue = dispatch_queue_create("haha2", NULL); for (int i = 0; i<20; i++) { dispatch_async(queue, ^{ // [NSThread sleepForTimeInterval:1.0]; NSLog(@"%d - %@",i,[NSThread currentThread]); }); } } #pragma mark - GCD死鎖串行隊列死鎖2 - (void)test2{ dispatch_queue_t queue = dispatch_queue_create("haha", DISPATCH_QUEUE_SERIAL); NSLog(@"001 - %@",[NSThread currentThread]); dispatch_async(queue, ^{ NSLog(@"002 - %@",[NSThread currentThread]); dispatch_sync(queue, ^{ NSLog(@"003 - %@",[NSThread currentThread]); }); NSLog(@"004 - %@",[NSThread currentThread]); }); NSLog(@"005 - %@",[NSThread currentThread]); } #pragma mark - GCD死鎖串行隊列死鎖 - (void)test{ // NSLog(@"zhi qian %@",[NSThread currentThread]); dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"sync - %@",[NSThread currentThread]); }); // NSLog(@"zhi hou %@",[NSThread currentThread]); /** * 注意: 代碼執行到第二句。dispatch這裏。 這句代碼會阻塞線程。也就是,如今主線程已經被阻塞。 而後,它很高興的把,block中的代碼,放到了main_queue裏。 然而,main_queue會取出block放到主線程裏去執行。 但是,如今主線程仍是被阻塞着。要等block執行完,才能夠不阻塞。 block,放到主線程,才能被執行。 * */ } @end
信號量 控制 最大併發數 - (void)test4{ dispatch_semaphore_t semaphore = dispatch_semaphore_create(10);//爲了讓一次輸出10個,初始信號量爲10 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); for (int i = 0; i <100; i++) { dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);//每進來1次,信號量-1;進來10次後就一直hold住,直到信號量大於0; dispatch_async(queue, ^{ NSLog(@"%i - %@",i,[NSThread currentThread]); sleep(2); dispatch_semaphore_signal(semaphore);//因爲這裏只是log,因此處理速度很是快,我就模擬2秒後信號量+1; }); } }