IOS 多线程

来源:互联网 发布:js display 显示 编辑:程序博客网 时间:2024/06/14 10:33
     程序;由源代码生成的可执行应用。
     进程:一个正在运行的程序可以看做一个进程,进程拥有独立运行所需要的全部资源。
     线程;程序中独立运行的代码段。
     一个线程是由一个或多个线程组成。进程只负责资源的调度和分配,线程才是程序真正的执行单元,负责代码的执行。
     //单线程
     每个正在运行的程序,至少包含一个线程,这个线程叫做主线程。
     主线程在程序启动的时候被创建,用于执行main函数。
     只有一个主线程的程序,称作单线程程序。
     主线程负责执行程序的所有代码,这些代码只能顺序执行,无法并行执行。
     //多线程
     拥有多个线程的程序,称作多线程程序。
     IOS允许用户自己开辟新的线程,相对于主线程来讲,这个叫做子线程。
     可以根据需要开辟若干个子线程
     子线程和主线程都是独立的运行单元,各自的执行互不影响,因此能够并发执行。
     //单。多线程的区别
     单线程程序:只有一个线程,代码顺序执行,容易出现代码阻塞(页面假死)
     多线程程序:有多个线程,线程间独立运行,能有效的避免代码堵塞,并能提高程序的运行性能。
     注:IOS中关于UI的添加和刷新必须在主线程中操作。
     线程阻塞:网络解析,图片加载,数据存储,数据库操作,复杂逻辑
     ios多线程实现种类:
NSThread,是一种轻量级的多线程,创建方法如下

    

    创建初始化initWithTarget:执行者 selector:选择器 object:参数对象
    //通过init方法创建的NSThread对象,需要手动开启start

NSThread *thread1 = [[NSThread alloc]initWithTarget:self selector:@selector(printNumber) object:nil];     [thread1 start];     [thread1 cancel];
[NSThread detachNewThreadSelector:@selector(printNumber) toTarget:self withObject:nil];

    在多线程方法中需要添加自动释放池。

     在应用打开的时候,会自动为主线程创建一个自动释放池。

     我们手动创建的子线程需要我没手动添加自动释放池。

NSOperation类,在MVC中属于M,是用于封装单个任务相关的代码和数据的类。因为它是抽象的,不能够直接使用这个类,而是使用子类(NSinvaocationOperation或     NSBlockOperation)来执行实际任务。其本身只是一个操作,本身无主线程、子线程之分,可以任意使用。通常与NSOperationQueue结合使用。

     NSOperationQueue,线程队列。用来管理一组Operation对的执行,会根据需求自动开辟合适数量的线程,一完成任务。

     NSOperation可以调节它在队列中的优先级

     当最大并发数设置为1时,能够实现线程同步。

//1.NSInvocatonOpreation操作     NSInvocationOperation *iOp = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(printNumber) object:nil];     //Opreation不能自己执行,需要通过队列进行调用     [[NSOperationQueue mainQueue] addOperation:iOp];     */
 //2.NSBlockOperation    NSBlockOperation *bOp = [[NSBlockOperation alloc]init];    ///以代码块的方式添加操作    [bOp addExecutionBlock:^{        for (int i = 0; i < 100; i++) {            NSLog(@"%d 当前线程%@",i,[NSThread currentThread]);        }    }];    //添加到线程队列    //[[NSOperationQueue mainQueue] addOperation:bOp];//主线程    [self.operationQueue addOperation:bOp]; //添加到子线程队列
//主队列 主线程    NSLog(@"主队列%@",[NSOperationQueue mainQueue]);    NSLog(@"主线程%@",[NSThread mainThread]);    //NSBlockOperation 创建方式 可以便利构造,直接添加block    /*     NSBlockOperation *bOp = [NSBlockOperation blockOperationWithBlock:^{     for (int i = 1; i < 100; i++) {     NSLog(@"%d%@",i,[NSThread currentThread]);     }     }];     NSBlockOperation *bOp1 = [NSBlockOperation blockOperationWithBlock:^{     for (int i = 1; i < 100; i++) {     NSLog(@"%d%@",i,[NSThread currentThread]);     }     }];     NSBlockOperation *bOp2 = [NSBlockOperation blockOperationWithBlock:^{     for (int i = 1; i < 100; i++) {     NSLog(@"%d%@",i,[NSThread currentThread]);     }     }];     //添加到主队列     //[[NSOperationQueue mainQueue] addOperation:bOp];     //自定义队列     self.operationQueue = [[NSOperationQueue alloc]init];     //设置最大并发数     self.operationQueue.maxConcurrentOperationCount = 4;     //[self.operationQueue addOperation:bOp1];     //[self.operationQueue addOperation:bOp2];     */

    NSObject,中存在一个最简单的后台执行的方法

//NSObject 简单后台方法     [self performSelectorInBackground:@selector(printNumber:) withObject:nil];

     GCD :中央派发机制 Grand Center Dispatch 基于函数 使用分队队列
//1.主线程队列    等同[NSOpreationQueue mainQueue]    //2.全局线程队列  后台队列,并行    //3.自定义线程队列 DISPATCH_QUEUE-SERIAL 串行 DISPATCH_QUEUE_CONCURRENT 并行    //创建自定义队列 DISPATCH_QUEUE_PRIORITY_DEFAULT 优先级    //任务:具有一定功能的代码段。一般式一个block或者函数    dispatch_queue_t maQueue = dispatch_queue_create("com.lanou3g.www.myQueue", DISPATCH_QUEUE_PRIORITY_DEFAULT);    //队列优先级 串行/并行    // dispatch_async (队列,执行block)    // dispatch_sync (队列, 执行block)    /*     dispatch_async(maQueue, ^{     [self printNumber:@"GCD"];     [self printNumber:@"C1"];     });     //添加操作     dispatch_async(maQueue, ^{     [self printNumber:@"G2"];     });     */    //并行队列    /*     dispatch_queue_t conQueue = dispatch_queue_create("com.lanou3g.www.conQueue", DISPATCH_QUEUE_CONCURRENT);     dispatch_async(conQueue, ^{     [self printNumber:@"G1"];     [self printNumber:@"G2"];     });     dispatch_async(conQueue, ^{     [self printNumber:@"G3"];     });     dispatch_async(conQueue, ^{     [self printNumber:@"G4"];     });

//声明一个打印方法-(void)printNumber:(NSString *)name{    for (int i = 0; i < 100; i++) {        NSLog(@"%d%@",i,[NSThread currentThread]);        NSLog(@"%@",name);    }}//设置最大并发数- (IBAction)didClickMaxConButton:(id)sender {    //线程队列的最大并发数    NSInvocationOperation *iOp1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(printNumber:) object:@"iop1"];    NSInvocationOperation *iOp2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(printNumber:) object:@"iop2"];    NSInvocationOperation *iOp3 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(printNumber:) object:@"iop3"];    NSInvocationOperation *iOp4 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(printNumber:) object:nil];    NSInvocationOperation *iOp5 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(printNumber:) object:nil];    //添加到线程队列    [self.operationQueue addOperations:@[iOp1,iOp2,iOp3,iOp4,iOp5] waitUntilFinished:YES];    }//设置依赖- (IBAction)didClickDependyButton:(id)sender {    NSInvocationOperation *iOp1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(printNumber:) object:@"iop1"];    NSInvocationOperation *iOp2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(printNumber:) object:@"iop2"];    NSInvocationOperation *iOp3 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(printNumber:) object:@"iop3"];    [iOp1 addDependency:iOp2];    [iOp2 addDependency:iOp3];    [self.operationQueue addOperations:@[iOp1,iOp2,iOp3] waitUntilFinished:YES];}//在延迟的时间点- (IBAction)didClickAfterButton:(id)sender {    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{        NSLog(@"等我5秒");    });}//重复执行- (IBAction)didClickApplyButton:(id)sender {    dispatch_apply(10, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t t) {        NSLog(@"重复十次 %zu次",t);    });}//当一个分组执行结束,notify之中的才会执行- (IBAction)didClickNotifyButton:(id)sender {    //创建分组标签    dispatch_group_t groupA = dispatch_group_create();    //使用分组    //创建队列    dispatch_queue_t myQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);    //将操作添加到队列,添加分组标签    dispatch_group_async(groupA, myQueue, ^{        [self printNumber:@"groupA"];    });    dispatch_group_async(groupA, myQueue, ^{        [self printNumber:@"groupAA"];    });    //notify    dispatch_group_notify(groupA, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{        NSLog(@"groupA的都执行完以后,我才能执行");    });}


0 0
原创粉丝点击