zoukankan      html  css  js  c++  java
  • Objective-c——多线程开发第一天(pthread/NSThread)

    一、为什么要使用多线程?

    1、循环模拟耗时任务

    1、同步执行

    2、异步执行

    (香烟编程小秘书)

    3、进程

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

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

    通过活动监视器,可以查看mac系统中的开启进程

    (外挂修改游戏进程中的数据,外挂用c汇编等底层)

    4、线程

    1个进程由一个或多个线程组成

    是进程的基本执行单元(至少一个线程)

    多线程:

    1个进程可开启多个线程,多个线程可以“同时”执行不同任务

    进程-公司,线程- 员工:老板:主线程

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

    1、安卓相隔一个虚拟机

    2、每一个晶体管中的核很小,逻辑没有苹果单核性能高

    3、苹果的cpu号称可以击败台式机的cpu

    单核执行原理:

    4个线程,线程1执行完紧接线程2?

    假设成立:线程1死循环还能跑?所以假设不成立

    多线程:不等待线程1执行完毕再执行线程2

    之所以说多线程同时进行,其实是切换进行,只是时间很快近乎同时

    多线程的优点:

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

    2、能够适当的提高资源的利用率

    多线程的缺点:(成本:时间成本/空间成本

    1、空间成本:每个线程占用的空间512kb

    2、时间成本:创建一个线程 大约90毫米

    3、线程间的通信,多线程的数据共享

    总结:线程之间是cpu切换执行

    1、老板——主线程(UI线程)

    程序的入口:main (AppDelegate)程序的生命周期

    所有的代码都是通过线程执行的

    主线程干的都是ui相关的事

    performSelectioInBackground

    重点:Ios中多线程的实现方案:

    1、pthread:历史悠久,,表示一种可以跨平台的方法,一段代码可以在iphoneandroid、windows几乎不用:语言C

    使用难度大,程序员要自己管理它的生命周期,

    2、NSThraad (NS开头术语Foundation框架,oc语言,面向对象:封装继承动态)

    还是要自己管理生命周期,偶尔使用

    3、GCD 也是C语言写的,经常被使用,苹果开发的技术,充分利用多核,很好优化,“透明”

    自动管理线程

    4、NSOperation:(NS OC写的foundation框架中的)

    对GCD的封装:相当于继承gcd的优点

    比GCD多了一些更简单实用的功能,使用更加面向对象

    ptread的介绍:

    p什么意思:p代表POSIX 表示可移植(跨平台)

    1系统导入的头文件,用尖括号

    #import<pthread.h>

    pthread_create:

    参数一、pthread_t:线程的标示

    参数二:ptheard_attr:attribute:属性

    c语言的话为空填入NULL

    参数三、:void *(*)(void *) :函数签名

    void *代表:约等于oc中的id 任意一个对象 返回值

    (*)函数名

    (void *)参数

    创建一个函数 线程要运行的函数:

    void * task (void *param)

    {

    return NULL;

    }

    填入:task:函数的首地址

    参数四:

    void *restrict:给第三个参数的函数一个参数

    NULL;

    5、pthread _create返回值是一个数字 “0”代表成功,非0则失败

    if(result == 0)

    NSLog(@“ok”);

    说明线程创建成功了

    6、 [NSThread currentThread]:打印当前线程

    只要number不等于1 就是一个子线程,number=1就是一个主线程中运行

    [_bridge NSString]桥接,在oc中写c 

    桥接的意思是:默认ARC下对OC对象有内存管理,不对C变量管理,桥接的作用是,C变量在适当的时候被释放

    总结:

    1、导入头文件

    2、创建线程pthread_Create

    3、创建函数方法 void *task(void*param)

    4、传递参数

    二、NSThread的简单介绍

    NSThread=[NSThread alloc 

    initWithTarget:]

    参数1:对象

    参数2:方法

    参数3:方法需要的参数

    NSThread这样创建是不会跑的

    这样写只是在内存中创建一个对象

    2、开启线程

    [thread start]

    方法二、创建线程:

    -(void)demo2

    {

    //detach:分离,可以理解为创建

    detachNewThreadSelector:

    参数1、方法

    参数2: 对象

    参数3:方法需要的参数

    [NSThread detachNewThreadSelector。。]

    }

    方法二的确定:如果你要对NSThread进行其他设置不便

    但是代码量少了

    方法三、

    参数1:方法

    参数2:方法的参数

    为啥没有参数:因为用的是self

    [self performSelectorInBackground

    压根没提thread:隐式创建线程

    线程的生命周期:

    线程的状态:

    1、创建线程

    2、开启线程:在内存中的变化:多了一个可调度线程池:好多线程,且CPU可以调度它

    new(新建)-》就绪(Runnable)——》CPU调度当前线程——》运行(running-》阻塞状态-》运行-》死亡

    就绪:这个线程除了CPU资源之外,别的资源都已到位

    cpu的来回切换,使CPU在当前线程和别的线程之间来回切换,而线程则在运行和就绪这两个状态之间来回切换

    运行的时候,如果除了cpu资源外,其它资源也没有了,那么就会调用Sleep方法等待同步锁

    因为不可调度,就会进入阻塞状态  离开可调度线程池

    要是苏醒了 线程会从阻塞状态进入运行状态吗?

    不会! 这时候不会直接到运行状态,而是回到就绪状态(sleep倒是得到同步锁)

    线程任务执行完毕 会死亡(死亡可以是自杀:也可以是他杀:强制结束线程)

    三、NSThread的常用属性

    线程确实是通过切换来进行

    同时创建两个线程

    第一个0时由哪个线程打印出来的?

    不清楚:那就给线程起名字

    thread.name =@“ ”

    thread.threadPirority

    多线程的基本概念总结:

    1、同步

    2、异步

    区别:同步是任务顺序执行,异步是同时间可多个运行

    3、进程:当前计算机中正在运行的应用程序

    4、线程:进程的基本执行单元,一个进程中有一个或多个线程

    5、多线程的生命周期和常见属性

    特点:线程来回切换运行

    主线程:不能在主线程执行耗时操作

    优点:

    适当的提升资源的利用率

    提升程序的执行效率

    缺点:

    线程不是开的越多越好

    因为:时间成本大约90毫秒和空间成本大约512kb

    pthread了解:

    NSThread 有三种创建方式

    1、alloc initWithTargrt

    2、detachNew

    3、performSelectorInBackground

    线程的生命周期:

    1、新建

    2、就绪

    3、运行

    4、阻塞

    5、死亡

    常见属性

    1、name

    2、优先级threadPirorty

  • 相关阅读:
    编写ocx出现未能注册输出。请确保您有修改注册表的相应权
    电子商务网站交互设计
    浅析Spring AOP
    ubuntu aptget
    URL对SEO的影响
    向各大搜索引擎提交你的网站
    站长SEO常用查询工具
    ubuntu关机重启命令
    vi中:x和:wq的区别
    RPM/AlienHowto
  • 原文地址:https://www.cnblogs.com/CityPe/p/5405909.html
Copyright © 2011-2022 走看看