• iOS中多线程知识总结(一)


    这一段开发中一直在处理iOS多线程的问题,但是感觉知识太散了,所以就把iOS中多线程的知识点总结了一下.

    1.基本概念

            1)什么是进程?进程的特性是什么?

                   进程是指在系统中正在运行的一个应用程序.

            特性: 每个进程之间都是独立的,每个进程都运行在其专用而且受保护的内存空间内.

               2)什么是线程?线程和进程的关系是什么?

          一个进程要想执行任务,必须要有线程(每一个进程至少要有一个线程),线程是进程的基本单元,一个进程中的所有任务都是在线程中执行

        关系: 进程包含线程

        3)什么叫多线程?

        一个进程中开启多条线程,每条线程可以并行执行不同的任务.例如: 同时执行多个下载任务时

        4)什么是线程并行? 什么是线程串行? 线程并行原理是什么?

        线程并行: 即同时执行多个线程

        线程串行: 一个线程中任务的执行是串行的,也就是说,同一时间,一个线程只能执行一个任务

        线程并行的原理: 在同一时间里,CPU只能处理一条线程,只有一条线程在工作.原理就是CPU在多条线程之间调度,如果CPU调度线程的时间足够的快,就造成了多线程并发执行的假象

        5)使用多线程的优缺点

          优点: 1)能适当提高程序的执行效率

             2)能适当提高资源利用率

          缺点: 1)开启线程需要占用一定的内存空间,如果开启大量线程的话,会占用大量的内存空间.降低程序的执行效率

             2)线程越多,CPU在调度线程上的开销,越大

             3)程序设计更加复杂,需要处理线程之间的通信,多线程的数据共享

        6)什么是主线程?主线程的作用?

           主线程: 一个iOS程序运行后,默认会开启一条线程,称为"主线程"或"UI线程"

           作用: 刷新显示UI,处理UI事件

    2.iOS中多线程的实现方案

        iOS中多线程的实现方案有四种: (1)pthread(C中的,几乎不用) (2)NSThread(偶尔使用)  (3)GCD(经常使用)  (4)NSOperation(底层是GCD,但更面向对象)

      1) pthread

      这种开启线程的方式比较底层,在iOS开发中几乎不用,就不多介绍了

      2) NSThread

         (1)特点:

            使用更加面向对象

            简单易用,可直接操作线程对象

         (2)声明周期: 

              由程序员进行管理

                 (3)NSThread四种创建方式

                      01.创建线程对象

     //01 创建线程对象
        /*
         第一个参数:目标对象
         第二个参数:方法选择器
         第三个参数:传递给方法选择器中调用方法的参数
         */
        //优点:能拿到线程对象 缺点:需要手动的启动线程
        NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(run:) object:@"ios"];
        //02 启动线程
        [thread start];

                      02.创建线程

     //方法二
        //优点:自动启动线程 缺点:不能拿到线程对象
        [NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:nil];

                       03.开启一条后台线程

    //方法三 开启一条后台线程
        //优点:自动启动线程 缺点:不能拿到线程对象
        [self performSelectorInBackground:@selector(run:) withObject:@"后台线程"];

                     04.自定义创建线程

    //方法四 自定义
        NewThread *threadB = [[NewThread alloc]init];
        [threadB start];

               (4)设置NSThread的属性

           设置属性比较常用的就是名称和优先级.设置名称可以通过它的name属性去设置,设置线程的优先级通过threadPriority 属性去设置.代码如下:

    //设置名称
         threadA.name = @"线程A";
    
    //设置优先级 0~1.0 默认是0.5 最高是1.0
         threadA.threadPriority = 1.0;
         threadC.threadPriority = 0.01;

           通过设置线程的优先级属性,可以实现让一个线程优先执行.

        (5)控制线程的状态

    //常用的控制线程状态的方法
            [NSThread exit];//退出当前线程
            [NSThread sleepForTimeInterval:2.0];//阻塞线程
            [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]];//阻塞线程

      GCD 和 NSOperation放到下篇再写.

  • 相关阅读:
    JS小记
    chrome 插件开发
    js闭包理解
    文件名后缀详解
    Glut 回调函数小结
    vc++ 6.0下Glut的配置 及 Glut 框架介绍
    数字图像点运算实践 (直方图均衡和分段线性拉伸)
    event.keycode值大全
    Bookmarklet
    牛人经典语录
  • 原文地址:https://www.cnblogs.com/muzichenyu/p/6029866.html
Copyright © 2020-2023  润新知