NSOperationQueue線程池應用

#import "ViewController.h"

@interface ViewController ()
{
    NSOperationQueue *_queue;
}
@end

@implementation ViewController

/*
 第二種 多線程技術
 任務 NSOperation 
 NSOperation是一個抽象類(當前類只聲明方法不實現,由子類實現方法),建立任務咱們須要建立NSOperation的子類對象
 
 建立任務以後,須要把任務放入任務隊列/線程池中 纔會異步執行任務
 
 */
- (void)viewDidLoad {
    [super viewDidLoad];
    //建立一個線程池
    _queue = [[NSOperationQueue alloc] init];
    
    //設置 最大併發任務的個數
    //最多容許多少個線程同時進行(異步執行)
    _queue.maxConcurrentOperationCount = 2;
    //若是設置爲1 那麼 線程池中的子任務之間就是串行執行(子線程之間同步)
    
    //第一種任務
    //[self creatOperation1];
    //第二種
    //[self creatBlockOperation];
    
    //第三類
    //直接向線程池 添加 block 任務
    [_queue addOperationWithBlock:^{
        NSLog(@"block任務2");
        for (NSInteger i = 0 ; i < 30; i ++) {
            [NSThread sleepForTimeInterval:0.2];
            NSLog(@"block2:%ld",i);
        }
    }];
    
}
#pragma mark - 帶block 的任務
- (void)creatBlockOperation {
    //建立一個block 任務
    NSBlockOperation *blockOp1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"block 任務1");
        for (NSInteger i = 0; i < 10; i++) {
            [NSThread sleepForTimeInterval:0.5];
            NSLog(@"block1:-》i = %ld",i);
        }
    }];
    //任務1結束以後會回調 下面的block
    [blockOp1 setCompletionBlock:^{
        NSLog(@"block 任務1結束");
    }];
    //放入 線程池
    [_queue addOperation:blockOp1];
    
}



#pragma mark - 請求任務
- (void)creatOperation1 {
    //建立一個任務
    NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operation1:) object:@"任務1"];
    
    //[op1 start];任務中start 表示 同步執行
    //要想異步執行任務 須要放入線程池中 ,一旦放入線程池會當即異步執行
    [_queue addOperation:op1];
    
    //多增長几個任務
    NSInvocationOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operation2:) object:@"任務2"];
    //放入線程池
    [_queue addOperation:op2];
    
    NSInvocationOperation *op3 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operation3:) object:@"任務3"];
    //放入線程池
    [_queue addOperation:op3];
}
- (void)operation1:(id)obj {
    NSLog(@"func:%s obj:%@",__func__,obj);
    for (NSInteger i = 0; i < 10; i++) {
        NSLog(@"i:%ld",i);
        [NSThread sleepForTimeInterval:0.5];
    }
    NSLog(@"任務1即將結束");
}
- (void)operation2:(id)obj {
    NSLog(@"func:%s obj:%@",__func__,obj);
    for (NSInteger i = 0; i < 10; i++) {
        NSLog(@"i:%ld",i);
        [NSThread sleepForTimeInterval:0.5];
    }
    NSLog(@"任務2即將結束");
}
- (void)operation3:(id)obj {
    NSLog(@"func:%s obj:%@",__func__,obj);
    for (NSInteger i = 0; i < 10; i++) {
        NSLog(@"i:%ld",i);
        [NSThread sleepForTimeInterval:0.5];
    }
    NSLog(@"任務3即將結束");
}





- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
相關文章
相關標籤/搜索