zoukankan      html  css  js  c++  java
  • 12

    一、多线程

     

    进程:一个应用程序配套一个进程,进程会加载应用程序的资源,进程是放代码的,一个进程默认是一个线程(主线程),可以有多个线程

    线程:执行代码的是线程,一个线程同时只能读取一段代码

    栈里的变量是跟线程紧密相关的

    比如有两个线程在栈里创建两个i,他们互不相干,两个i属于自己线程的。

    一核跑多个线程就会互掐。

    相关

    cpu负责执行代码

    线程负责读取代码并提供给cpu执行

    cpu时间片

    并发:多个线程同时执行,同一时间还是只有一个线程在执行

    多核:cpu有多个可以用于计算的核,多核很有可能一个线程跑在一个核上,这样就互不影响了

     

    为什么要多线程

    堵塞线程

    有很多原因能让线程堵塞

    耗时操作:读文件、读网络文件、计时器

    // 脱落出一个新的线程

        [NSThreaddetachNewThreadSelector:@selector(run:) toTarget:selfwithObject:Nil];

     

    同步/异步

    同步:synchronize

    异步:asynchronize

    数据同步:

    a有的,b也有,保持一致

    同步:一行一行执行        单线程 顺序 无并发

    异步:多个线程同时执行    多线程 乱序 有并发

     

    并发下的数据访问

    所有的局部变量都是跟线程相关

     

    ios中的主线程是死循环

    命令行的主线程执行完就return 0程序就结束了

    所以要睡上一段时间,等子线程执行完

    -(void)run{

        [NSThreaddetachNewThreadSelector:@selector(run2:) toTarget:selfwithObject:Nil];

        [NSThreaddetachNewThreadSelector:@selector(run2:) toTarget:selfwithObject:Nil];

        [NSThread sleepForTimeInterval:10];

    }

    -(void)run2:(id)sender{

        [selfloop];

    }

    -(void)loop{

        while (self.count < 100) {

            NSLog(@"%ld", self.count);

            self.count++;

        }

    }

     

    加锁机制

    目的:让一段代码只能有一个线程执行,直到这个线程解锁后,才能让其他线程执行

    如何使用?

    NSCondition

    lock

    unlock

    @synchronized(obj){//code}

    obj任何对象都可以作为锁对象

    一旦使用obj进入code以后,整个程序中任何地方使用@synchronized(obj2)

    如果obj2如果是obj则进不去,否则进得去

     

    二、执行队列

    1 什么是执行队列?

    执行队列是一个处理并发问题的一个全新的思考模式

    它是管理线程的

    2为什么要让执行队列管理线程?

    因为创建线程和维护线程需要大量的资源

    线程池?

    一个专门用于存放创建好的线程的地方

    3执行队列的机理

     

    三、GCD 帮我们去管理队列

    是什么?Grand Center Dispatch中央任务分发

    提供了什么?

    1)更简单的代码方式去处理OperationQueue

    2)管理队列使用的

    用于干嘛?

    1)快速的将一行代码异步执行

     

    子线程不能修改主线程界面上的东西,换句话说就是子线程不能改界面

    所有更新界面的代码必须在主线程上执行,只有主线程才可以更新界面

     

    怎么用?

    1)获取默认级别的系统队列

    2)把耗时操作扔进去

    3)把更新界面操作扔回主队列(里面的主线程)执行

    - (IBAction)tap:(id)sender {

        NSString *path = @"http://images.apple.com/cn/imac/features/images/display_hero.jpg";

        NSURL *url = [NSURLURLWithString:path];

       

        // 系统写好的queue

        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

        // 异步执行

        dispatch_async(queue, ^{

            NSData *data = [NSDatadataWithContentsOfURL:url]; // 耗时操作

            UIImage *image = [[UIImagealloc] initWithData:data];

            // 主线程执行更新界面操作

            dispatch_async(dispatch_get_main_queue(), ^{

                self.imageview.image = image;

            });

        });

    }

     

    作业:

    读取网络图片的tableview,不用堵塞主线程下载并更新cell上的图片

    NSArray * data = @{

    @"http:://image...."

    @"http:://image...."

    @"http:://image...."

    };

  • 相关阅读:
    Stack Overflow 2016最新架构探秘
    (转)个人职业规划中如何使自己的职业生涯升华
    (转)软件架构师应该知道的97件事
    (转)一共81个,开源大数据处理工具汇总
    (转) 架构师的能力模型
    (转)数据库表分割技术浅析(水平分割/垂直分割/库表散列)
    (转)乐观锁与悲观锁——解决并发问题
    (转)从“如何设计用户超过1亿的应用”说起—数据库调优实战
    (转)浅谈数据库的水平拆分
    (转).NET Memory Profiler 使用简介
  • 原文地址:https://www.cnblogs.com/yangmx/p/3674797.html
Copyright © 2011-2022 走看看