IOS 多线程

     程序;由源代码生成的可执行应用。
     进程:一个正在运行的程序可以看做一个进程,进程拥有独立运行所需要的全部资源。
     线程;程序中独立运行的代码段。
     一个线程是由一个或多个线程组成。进程只负责资源的调度和分配,线程才是程序真正的执行单元,负责代码的执行。
     //单线程
     每个正在运行的程序,至少包含一个线程,这个线程叫做主线程。
     主线程在程序启动的时候被创建,用于执行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的都执行完以后,我才能执行");
    });
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值