NSOperationQueue 线程池的使用

来源:互联网 发布:网络电视看不见翡翠台 编辑:程序博客网 时间:2024/06/05 16:06
#import "ViewController.h"@interface ViewController ()@property(nonatomic,retain)NSOperationQueue *queue;@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib.}- (void)didReceiveMemoryWarning {    [super didReceiveMemoryWarning];    // Dispose of any resources that can be recreated.}#pragma mark -Queue控制方法-//暂停-(IBAction)btnPause:(id)sender{    //1.正在执行的任务不能暂停    //2.只能暂停未开始的任务    //3.默认是并发执行的,如果想控制队列,只能通过依赖关系,    //4.使其变成串行之后才能执行???    [self.queue setSuspended:YES];}//继续-(IBAction)btnResume:(id)sender{    //取消所有    //1.正在执行的任务不能取消    //2.只能取消未开始的任务    [self.queue setSuspended:NO];}//取消-(IBAction)btnCancel:(id)sender{    [self.queue cancelAllOperations];}#pragma mark -NSOperation-/**    NSOperationQueue */-(IBAction)playOnQueueControlMore:(id)sender{    NSInvocationOperation *iop1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(eat) object:nil];    NSInvocationOperation *iop2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(drink) object:nil];        //依赖关系    //1.决定了任务执行的先后顺序 被依赖者先执行    //2.如果被依赖者没有加进来,就不会执行    //3.依赖关系优先级最高    [iop1 addDependency:iop2];        NSOperationQueue *queue = [[NSOperationQueue alloc]init];            [queue addOperation:iop1];        [queue addOperation:iop2];        self.queue = queue;}/** * 控制NSOperationQueue来执行 */-(IBAction)playOnQueueControl:(id)sender{    NSInvocationOperation *iop1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(eat) object:nil];    NSInvocationOperation *iop2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(drink) object:nil];        //依赖关系    //1.决定了任务执行的先后顺序 被依赖者先执行    //2.如果被依赖者没有加进来,就不会执行    //3.依赖关系优先级最高    [iop1 addDependency:iop2];        NSOperationQueue *queue = [[NSOperationQueue alloc]init];    //    [queue addOperation:iop1];//    [queue addOperation:iop2];        //是否等待队列中的任务都执行完再去执行后面的逻辑代码    [queue addOperations:@[iop1,iop2] waitUntilFinished:YES];        //等待所有的任务都完成后(挂起主线程),再去执行其他(主线程继续)    [queue waitUntilAllOperationsAreFinished];        NSLog(@"任务完成");//这条代码是由主线程完成的    }/**    创建NSOperationQueue来执行 */-(IBAction)playOnQueue:(id)sender{    //创建任务    NSInvocationOperation *iop1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(eat) object:nil];    NSInvocationOperation *iop2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(drink) object:nil];    NSBlockOperation *bop = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"shut up%@",[NSThread currentThread]);        NSLog(@"毒蛇");    }];        [bop addExecutionBlock:^{        [self sleep];    }];        //创建一个任务队列    //1.把任务交给队列管理,队列内的任务是并发执行的    //2.任务都是在子线程运行的    //3.不会阻塞主线程    //4.不需要调用start方法,自动就执行了    //5.可以设定最大的并发数量(需要在添加任务之前设定,会按照任务顺序执行)    NSOperationQueue *queue = [[NSOperationQueue alloc]init];    //把任务交给队列来执行和管理        queue.maxConcurrentOperationCount = 2;    [queue addOperation:iop1];    [queue addOperation:iop2];    [queue addOperation:bop];        //同一时间内最大的并发数量    //公司用的GCD 多 但是朝opreation 发张     }/** *  在主线程演示卡顿 */-(IBAction)playOnMain:(id)sender{    //申请一个操作    //默认是一个主线程//    NSInvocationOperation *iop = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(eat)  object:nil];//    [iop start];        //创建一个block类型的操作    NSBlockOperation *bop = [NSBlockOperation blockOperationWithBlock:^{        [self eat];    }];    //追加执行一个block;    //会开启线程并行执行    [bop addExecutionBlock:^{        [self drink];    }];    //添加完成结束后的block    bop.completionBlock = ^{        [self sleep];    };        [bop start];}#pragma mark -任务--(void)eat{    int i = 0;    while (i++ < 10) {        NSThread *th = [NSThread currentThread];        NSLog(@"%@",th);        NSLog(@"已经吃了%d碗了,不怕胖吗",i);        [NSThread sleepForTimeInterval:1];    }}-(void)drink{    int i = 0;    while (i++ < 10) {        NSThread *th = [NSThread currentThread];        NSLog(@"%@",th);        NSLog(@"已经喝了%d瓶了",i);        [NSThread sleepForTimeInterval:1];    }}-(void)sleep{    int i = 0;    while (i++ < 10) {        NSThread *th = [NSThread currentThread];        NSLog(@"%@",th);        NSLog(@"已经睡了%d天了,你是                                             
0 0