GCD-演練

#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;
        });
    }
    
}
相關文章
相關標籤/搜索