zoukankan      html  css  js  c++  java
  • ios29--多线程

    进程是指在系统中正在运行的一个应用程序(一个程序可以对应多个进程)。
    每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内。
    比如同时打开迅雷、Xcode,系统就会分别启动2个进程。
    1个进程要想执行任务,必须得有线程(进程是线程组成的,进程的所有任务都是线程完成的,每1个进程至少要有1条线程)。
    1个线程中任务的执行是串行的。线程是串行的(一个一个的执行的),要在1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务,也就是说,在同一时间内,1个线程只能执行1个任务。


    进程和线程的比较:
    1.线程是CPU调用(执行任务)的最小单位。
    2.进程是CPU分配资源和调度的单位。(cpu在分配资源是按进程为单位进行分配的,不会按照线程为单位进行分配。但是进程中的任务是线程完成的,所以线程是cpu执行的最小单位)。
    3.一个程序可以对应多个进程,一个进程中可以有多个线程,但至少要有一个线程。
    4.同一个进程内的线程共享进程的资源


    多线程:
    1.1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务.(线程内部是串行的,但是线程和线程是可以同时进行的)。
    2.进程 —— 车间,线程 —— 车间工人
    3.多线程技术可以提高程序的执行效率


    多线程的原理:
    1.同一时间,CPU只能处理1条线程,只有1条线程在工作(执行)
    2.多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换)
    3.如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象(多核CPU就是真正的多线程了)
    4.线程过多会造成cpu切换消耗过大(切换需要保存上下文),cpu累死。通常3-5个线程就可以了。

    多线程的优缺点:
    多线程的优点:
    1.能适当提高程序的执行效率,能适当提高资源利用率(CPU、内存利用率)。

    多线程的缺点:
    1. 创建线程是有开销的(空间开销,时间开销),iOS下主要成本包括:内核数据结构(大约1KB)、栈空间(子线程512KB、主线程1MB,也可以使用-setStackSize:设置,但必须是4K的倍数,而且最小是16K),创建线程大约需要90毫秒的创建时间。
    如果开启大量的线程,会降低程序的性能。
    线程越多,CPU在调度线程上的开销就越大。
    2. 程序设计更加复杂:比如线程之间的通信、多线程的数据共享(数据安全)。


    主线程:
    一个iOS程序运行后,默认会开启1条线程,称为“主线程”或“UI线程”。
    主线程的主要作用:显示刷新UI界面,处理UI事件(比如点击事件、滚动事件、拖拽事件等)。
    主线程的使用注意:别将比较耗时的操作放到主线程中,耗时操作会卡住主线程,严重影响UI的流畅度,给用户一种“卡”的坏体验。

    子线程:将耗时操作放在子线程(后台线程、非主线程)。

    //
    //  ViewController.m
    //  01-了解-耗时操作
    //
    //  Created by xiaomage on 16/2/18.
    //  Copyright © 2016年 小码哥. All rights reserved.
    //
    
    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        //1.获得主线程,主线程是不能手动开启的,主线程只有一个,是系统开启的,
        NSThread *mainThread = [NSThread mainThread];
        NSLog(@"%@",mainThread);// <NSThread: 0x608000066140>{number = 1, name = main}
        
        //2.获得当前线程,如果没有开启线程,默认就是主线程。
        NSThread *currentThread  = [NSThread currentThread];
        NSLog(@"%@",currentThread);//<NSThread: 0x608000066140>{number = 1, name = main}
    
        
        //3.判断主线程
        //3.1 number  == 1
        //3.2 类方法
        BOOL isMainThreadA = [NSThread isMainThread];
        //3.3 对象方法
        BOOL isMainThreadB = [currentThread isMainThread];
        NSLog(@"%zd---%zd",isMainThreadA,isMainThreadB);//1,1
    }
    
    - (IBAction)btnClick:(id)sender {//按钮的点击事件是主线程处理的。
        
        for (NSInteger i = 0; i <10000; i++) {
            NSLog(@"%zd----%@",i,[NSThread currentThread]);//主线程进入这个方法,耗时,主线程出不来,此时外面的其他UI控件不能点击了。
        }
        
    }
    
    
    
    @end
  • 相关阅读:
    从编程到入侵
    编程实现盗2005 Beta2版QQ
    Justin Frankel:Winamp的反斗奇星
    用安静的热情征服联合国
    我和试用期员工之间的故事
    Sogou输入法之父给我们的启示
    《ATL开发指南》的一个值得商榷的地方
    厦门PX项目迁址:意义有限的进步
    探析项目主导型的IT业的人员需求变化及其应对办法
    今天,影响了一位试用期员工的去留
  • 原文地址:https://www.cnblogs.com/yaowen/p/7488617.html
Copyright © 2011-2022 走看看