關於maxConcurrentOperationCount的驗證

官方文檔
在這裏插入圖片描述
混淆的地方

最大線程數量&當maxConcurrentOperationCount = 1 queue爲串行隊列&控制NSBlockOperation的多少.

實踐
一.maxConcurrentOperationCount = 1時
1.純NSBlockOperation驗證

 NSBlockOperation *blockop1 = [NSBlockOperation blockOperationWithBlock:^{
        for (NSInteger i=0; i<5;i++ ) {
            
            [NSThread sleepForTimeInterval:2];
            
            NSLog(@"block1---0操作 %@",[NSThread currentThread]);
        }
    }];
    
    [blockop1 addExecutionBlock:^{
        for (NSInteger i=0; i<4;i++ ) {
            
            [NSThread sleepForTimeInterval:2];
            
            NSLog(@"block1-----1操作 %@",[NSThread currentThread]);
        }
    }];


     [blockop1 addExecutionBlock:^{
    for (NSInteger i=0; i<3;i++ ) {
        
        [NSThread sleepForTimeInterval:2];
        
        NSLog(@"block1add-----2操作 %@",[NSThread currentThread]);
    }
}];

    
    
    
    NSBlockOperation *blockop2 = [NSBlockOperation blockOperationWithBlock:^{
        for (NSInteger i=0; i<7;i++ ) {
            
            [NSThread sleepForTimeInterval:2];
            
            NSLog(@"block2----總操作 %@",[NSThread currentThread]);
        }
    }];
    
    
    [blockop2 addExecutionBlock:^{
        for (NSInteger i=0; i<6;i++ ) {
            
            [NSThread sleepForTimeInterval:2];
            
            NSLog(@"block2add-----1操作 %@",[NSThread currentThread]);
        }
    }];

   NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    queue.maxConcurrentOperationCount = 1;
   [queue addOperations:@[blockop1,blockop2] waitUntilFinished:NO];


打印
在這裏插入圖片描述當queue中有2個任務操作時 queue.maxConcurrentOperationCount = 1會開啓新的線程所以同一時間執行同一類型的任務操作

2.純NSInvocationOperation驗證

 NSInvocationOperation *inoperation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];
    
    
    NSInvocationOperation *inoperation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];


 NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    queue.maxConcurrentOperationCount = 1;
   [queue addOperations:@[inoperation,inoperation2] waitUntilFinished:NO];

打印
在這裏插入圖片描述
當queue中有2個任務操作時 queue.maxConcurrentOperationCount = 1同一時間執行同一類型的任務操作

3.NSInvocationOperation+NSBlockOperation驗證

 NSBlockOperation *blockop1 = [NSBlockOperation blockOperationWithBlock:^{
        for (NSInteger i=0; i<5;i++ ) {
            
            [NSThread sleepForTimeInterval:2];
            
            NSLog(@"block1---0操作 %@",[NSThread currentThread]);
        }
    }];
    
    [blockop1 addExecutionBlock:^{
        for (NSInteger i=0; i<4;i++ ) {
            
            [NSThread sleepForTimeInterval:2];
            
            NSLog(@"block1-----1操作 %@",[NSThread currentThread]);
        }
    }];


     [blockop1 addExecutionBlock:^{
    for (NSInteger i=0; i<3;i++ ) {
        
        [NSThread sleepForTimeInterval:2];
        
        NSLog(@"block1add-----2操作 %@",[NSThread currentThread]);
    }
}];
 NSInvocationOperation *inoperation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];


 NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    queue.maxConcurrentOperationCount = 1;
   [queue addOperations:@[blockop1,inoperation] waitUntilFinished:NO];

打印:在這裏插入圖片描述
當queue中有2個任務操作時 queue.maxConcurrentOperationCount = 1也會開啓新的線程 同一時間片執行了同一類型的任務操作

總結:maxConcurrentOperationCount不是控制線程最大數而是控制隊列中同一時間片能執行多少個類型的任務操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章