zoukankan      html  css  js  c++  java
  • 多线程-相关定义

    进程的定义:

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

    每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内

    线程的定义:

    1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程)

    线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行

    线程的串行:

    1个线程中任务的执行是串行(顺序执行的)的

    如果要在1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务

    也就是说,在同一时间内,1个线程只能执行1个任务

    多线程的定义:

    1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务

    多线程技术可以提高程序的执行效率

    多线程的原理:

    同一时间,CPU只能处理1条线程,只有1条线程在工作(执行)

    多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换)

    如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象

    如果线程非常非常多,会发生什么情况?

    CPU会在N多线程之间调度,CPU会累死,消耗大量的CPU资源

    每条线程被调度执行的频次会降低(线程的执行效率降低)

    多线程的优点:

    能适当提高程序的执行效率

    能适当提高资源利用率(CPU、内存利用率)

    多线程的缺点:

    开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB),如果开启大量的线程,会占用大量的内存空间,降低程序的性能

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

    程序设计更加复杂:比如线程之间的通信、多线程的数据共享

    主线程的定义:

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

    主线程的主要作用:

    显示刷新UI界面

    处理UI事件(比如点击事件、滚动事件、拖拽事件等)

    主线程的使用注意:

    别将比较耗时的操作放到主线程中

    耗时操作会卡住主线程,严重影响UI的流畅度,给用户一种“卡”的坏体验

    线程的状态:

    新建(NEW)—-(Start)—>就绪(Runnable)—(CPU调度当前线程)->运行(Running)

    —>(任务执行完毕或异常强制退出)—死亡(Dead)

    如果sleep或得到同步锁线程就会从就绪状态到阻塞状态,就会被移出可调度线程池

    控制线程的状态:

    启动线程:- (void)start;

    进入就绪状态 -> 运行状态。当线程任务执行完毕,自动进入死亡状态

    阻塞(暂停)线程  // 进入阻塞状态

    + (void)sleepUntilDate:(NSDate *)date;

    + (void)sleepForTimeInterval:(NSTimeInterval)ti;

    强制停止线程

    + (void)exit;

    多线程的安全隐患:

    1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源

    比如多个线程访问同一个对象、同一个变量、同一个文件

    当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题

    多线程安全隐患解决:

    互斥锁使用格式

    @synchronized(锁对象) { // 需要锁定的代码  }

    注意:锁定1份代码只用1把锁,用多把锁是无效的

    互斥锁的优缺点

    优点:能有效防止因多线程抢夺资源造成的数据安全问题

    缺点:需要消耗大量的CPU资源

    互斥锁的使用前提:多条线程抢夺同一块资源

    相关专业术语:线程同步

    线程同步的意思是:多条线程按顺序地执行任务

    互斥锁,就是使用了线程同步技术

    属性的原子性和非原子性:

    OC在定义属性时有nonatomic和atomic两种选择

    atomic:原子属性,为setter方法加锁(默认就是atomic)

    nonatomic:非原子属性,不会为setter方法加锁

    nonatomic和atomic对比

    atomic:线程安全,需要消耗大量的资源

    nonatomic:非线程安全,适合内存小的移动设备

    iOS开发的建议:

    所有属性都声明为nonatomic

    尽量避免多线程抢夺同一块资源

    尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力

    线程间的通信:

    在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信

    线程间通信的体现

    1个线程传递数据给另1个线程

    在1个线程中执行完特定任务后,转到另1个线程继续执行任务

    线程间通信常用方法

    - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;

    - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;

    0 -> pThread(前提:#import <pthread.h>)

    //点击按钮,创建一条子线程

    - (IBAction)click:(id)sender

    {

        NSLog(@"开始点击按钮");

        // 新建一条子线程

        pthread_t threadId;

        pthread_create(&threadId, NULL, run, NULL);

        NSLog(@"按钮点击结束");

    }

    //执行run方法

    void *run(void *data)

    {

        // 获取当前线程

        NSThread *thread = [NSThread currentThread];

        for (int i = 0; i < 100; i++) {

            NSLog(@"%@ %d", thread, i);

        }

        return NULL;

    }

  • 相关阅读:
    Windows XP下 Android开发环境 搭建
    Android程序的入口点
    在eclipse里 新建android项目时 提示找不到proguard.cfg
    64位WIN7系统 下 搭建Android开发环境
    在eclipse里 新建android项目时 提示找不到proguard.cfg
    This Android SDK requires Android Developer Toolkit version 20.0.0 or above
    This Android SDK requires Android Developer Toolkit version 20.0.0 or above
    Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead
    Windows XP下 Android开发环境 搭建
    Android程序的入口点
  • 原文地址:https://www.cnblogs.com/bluceZ/p/3942749.html
Copyright © 2011-2022 走看看