一。绪论

  1.进程:平时看到的一个应用程序,即可算作一个线程。

     每个进程都有一个PID作为进程ID,有一个Process Name作为进程名字等。

  2.线程:一个进程可以有多个线程,而每个线程只可属于一个进程。

      开发者可以创建其他线程来配合主线程的工作,但是子线程一般只用做逻辑处理的执行流程。

      无论是MacOSX还是IOS,界面的处理都必须放在主线程中进行。

  ios SDK支持多线程,并且提供了NSOperation和NSOperationQueue类来方便多线程编写。

*******************************

二。NSThread

  1.在单个程序中同时运行多个线程完成不同的工作,称为多线程。

  2.在ios SDK上,NSThread类实现多线程。

  3.如果有太多的线程在执行的话,系统可能就会瘫痪。一个解救方法:创建少一点的线程。

    i。NSOperationQueue类实现。

    ii。sleep:可以让一个线程sleep一段时间或者是让它在某一个时间点被唤醒。在sleep的这段时间内,该线程就把系统的时间片交给了其他的线程。

        如果你想让线程休眠特定的时间,调用NSThread的类方法:sleepForTimeInterval:

          [NSThread sleepForTimeInterval:2.5];

        如果你想让线程在某个特定的时刻被唤醒就用方法:sleepUntilDate:

          [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.5]];

  4.NSThread类库也支持开发者的一些配置,如果需要配置新线程属性的话,就不用使用类方法这种以默认方式快速创建对象的方法了,代之直接使用NSThread的start方法即可。

    例子: 

      NSThread *newThread = [[NSThread alloc] initWithTarget:self
                                 selector:@selector(newThread:)
                                object:@"hello"];
      [newThread setName:@"HelloThread"];
      [newThread setStackSize:4*1024]; //4KB的整数倍
      [newThread setThreadPriority:1.0f];
      [newThread start];

  5.NSThread提供了大部分平时在控制线程时的方法,并且NSThread最清楚当前线程的状况。

    判断当前线程是否为主线程:[NSThread isMainThread];

    判断当前是否是多线程状态:[NSThread isMultiThreaded];

    当前线程的信息:[[NSThread currentThread] threadDictionary];

    需要提前结束线程:[NSThread exit];

*******************************

三。pthread(了解即可)

  POSIX线程(POSIX threads),简称Pthreads,是线程的POSIX标准。该标准定义了创建和操纵线程的一整套API。在类Unix操作系统(Unix、Linux、Mac OS X等)中,都使用Pthreads作为操作系统的线程。Windows操作系统也有其移植版pthreads-win32。

*******************************

四。NSOperation(操作)和NSOperationQueue(操作队列)

  1.operation就是一些指令的集合,然后由operation queue来管理。

  2.这里每一个operation基本上都是NSOperation子类的实例。ios提供了NSOperation的一个子类叫做NSInvocationOperation(调用队列),在这个类中可以指定一个对象和一个selector。

  3.operation的依赖性:

    任何一个operation都能选择性地和另一个或几个operation存在一定的依赖性。

    例如:一个operation要在另一个operation之前完成,因此operation queue就会知道线完成哪一个operation。

    添加依赖关系:

    返回一个operation所有的依赖关系:

    移除一个operation的某一个依赖关系:

  4.operation的优先级:

    优先级状态(5种):

    设置每个operation的优先级:setQueuePriority方法。

  5.operation的状态:

    operation的一些成员变量能够放映其状态。

    像:isCancelled:反映一个operation是否被取消。

  6.取消一个operation:

    用cancel方法来取消一个operation。

    例如:[firstOperation cancel];

  

  以上都是operation,下面是operarion queue。

  7.operation queue:  

    创建一个operation queue和创建其他的对象一样:

      NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    向新创建的operation queue添加operation:

      [queue addOperation:newOperation];

*******************************

五。GCD

  1.从MacOSX10.6和IOS4.0开始,苹果提供给开发者一个多线程并发的类库供开发者使用。这个类库名为“Grand  Central Dispatch”,平时大家都简称为GCD。

  2.GCD提供了一套C语言的方法列表,利用这些方法开发者不仅能够做到和之前NSThread同样多的事情,并且更重要的一点是,此类库可以让开发者跳过负载平衡的课题,直接让应用程序在多核的设备或者电脑上本质上加强性能和工作效率。

  3.GCD提供了一种很简单的操作方式来实现并行处理,可以把要并发执行的代码放在一个block上,然后把这个block加入到一个queue当中。

  4.GCD的使用方法大致浏览下来,大多需要和block语法配合起来展现威力。

  5.在GCD中为我们需要执行的block提供了3种队列:

    Main:

    Concurrent:

    Serial:

  6.对于系统提供的3个默认队列来说,当需要获得他们的时候,只需要通过下列方法即可。

    dispatch queue t dispatch get global queue(long priority, unsigned long flags);

  7.获得一个concurrent队列,使用:dispatch_global_queue()方法。

  8.获得一个main队列,使用:dispatch_get_main_queue()方法。

  9.创建一个队列,使用:dispatch_queue_create()方法。

  10.如果想在后台完成一些任务,就把指令包裹在一个block上,然后把这个block加入到指定的队列中。

    如:dispatch_async(我们请求加入的队列,我们要加入的block)。

  11.同步:dispatch_async

   异步:dispatch_sync

   需要多次执行一段同步任务:dispatch_apply

*******************************

六。线程安全

  为了解决多线程之间使用所产生冲突的问题,苹果味开发者提供了多种解决方案。

  1.NSLock的使用(需要熟悉“信号量”和“互斥机制”)

    i。申请到信号量:lock方法。

       tryLock:在申请不到信号量时不会让当前线程等待在那里,而是马上返回NO后继续执行下面代码。

       lockBeforeDate:让当前线程等待到指定日期后才放弃等待。

    ii。NSLock并非没有缺点,它有3个固有问题需要重视。

  2.synchronized的使用

    a。苹果常被认为是一家相当会提供补丁方案的公司,当苹果发现开发者对于NSLock使用烦琐而频繁抱怨后,立即意识到需要为开发者再多做一些事情搞定容易出问题的NSLock。这个新的解决方案就是@synchronized关键字。

    b。@synchronized关键字能够对任何一个对象进行加锁,一旦加锁后,对这个对象发送的消息将会被阻塞,直到@synchronized所管理的那段关键代码执行完毕后自动将此对象解锁为止。

    c。在使用@synchronized时苹果也为它提供了自动的异常处理机制,一旦出现问题会抛出异常给系统,系统会将此异常返回个应用程序,所以如果我们在应用程序中没有一套有效的处理异常的框架,就最好不要用@synchronized,以避免异常没有接受者。

  3.condition的使用

    在线程安全中,处理多个线程抢资源这种互斥形式外,还有一种互相依赖的形式。

      例如:将A理解为信号量的产生者,将B理解为信号量的消费者。最理想的情况下,B等待在那里直到A完成任务将B唤醒后,B继续执行自己的任务。

    互相依赖锁的实现可以使用NSConditionLock类库或者NSCondition来撰写。

    

IOS多线程(一)的更多相关文章

  1. iOS多线程主题

    下面是:2个并发进程.和2个并发线程的示意图: 下面介绍三种多线程技术(Thread.Cocoa Operation.Grand Central Dispatch): 1.最轻量级Thread(需要自 ...

  2. iOS多线程技术方案

    iOS多线程技术方案 目录 一.多线程简介 1.多线程的由来 2.耗时操作的模拟试验 3.进程和线程 4.多线程的概念及原理 5.多线程的优缺点和一个Tip 6.主线程 7.技术方案 二.Pthrea ...

  3. iOS 多线程GCD的基本使用

    <iOS多线程简介>中提到:GCD中有2个核心概念:1.任务(执行什么操作)2.队列(用来存放任务) 那么多线程GCD的基本使用有哪些呢? 可以分以下多种情况: 1.异步函数 + 并发队列 ...

  4. iOS多线程到底不安全在哪里?

    iOS多线程安全的概念在很多地方都会遇到,为什么不安全,不安全又该怎么去定义,其实是个值得深究的话题. 共享状态,多线程共同访问某个对象的property,在iOS编程里是很普遍的使用场景,我们就从P ...

  5. iOS多线程的详情使用示例--简进祥

    大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能 ...

  6. iOS多线程

    关于iOS多线程 概述 这篇文章中,我不会说多线程是什么.线程和进程的区别.多线程有什么用,当然我也不会说什么是串行.什么是并行等问题,这些我们应该都知道的. 在 iOS 中其实目前有 4 套多线程方 ...

  7. iOS多线程学习及总结

    能有份网上的存储资料,备以后提升及参考 iOS 多线程编程 简介 一.      iOS有三种多线程编程的技术,分别是: 1.        NSThread 2.        Cocoa NSOp ...

  8. iOS多线程杂论

    iOS多线程的分布 (1) NSThread (2) NSOperation (3) GCD 现在对下面三个进行一个个的分析,希望那里说得不对的地方希望简友们帮我指点一二. 1,NSThread 优点 ...

  9. iOS多线程开发

    概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操 ...

  10. iOS多线程编程之NSThread的使用

      目录(?)[-] 简介 iOS有三种多线程编程的技术分别是 三种方式的有缺点介绍 NSThread的使用 NSThread 有两种直接创建方式 参数的意义 PS不显式创建线程的方法 下载图片的例子 ...

随机推荐

  1. Jquery插件收藏

    1.带小图标的多级菜单导航 演示地址:http://js.itivy.com/memu/sample.html 下载地址:http://js.itivy.com/?p=100 效果图:  推荐一个自己 ...

  2. nginx 环境搭建(基于linux)

    Nginx是一种服务器软件,故而其最主要.最基本的功能当然是可以与服务器硬件结合,让程序员可以将程序放在Nginx服务器上,将程序发布出去,让成千上万的网民可以浏览.除此之外,Nginx是一种高性能的 ...

  3. [ActionScript 3.0] AS3 对XML的操作,创建、删除、增加节点方法

    package { import flash.display.Sprite; /** * @author:Frost.Yen * @E-mail:871979853@qq.com * @create: ...

  4. Java static解析

    static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块 一.static变量 被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它 ...

  5. ubuntu关闭THP

    所有linux系统详细设置参考: https://docs.mongodb.org/manual/tutorial/transparent-huge-pages/ vi /etc/init.d/dis ...

  6. Spark1.0源码编译

    编译方式一:mavenexport MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"m ...

  7. SQL Server :Stored procedures存储过程初级篇

    对于SQL Server,我是个拿来主义.很多底层的原理并不了解,就直接模仿拿着来用了,到了报错的时候,才去找原因进而逐步深入底层.我想,是每一次的报错,逼着我一点点进步的吧. 近期由于项目的原因,我 ...

  8. ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决办法

    ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决办法 今天遇到的一个问题: 直接修改数据表中的某些字段数据内容时报错: ORA-01461: 仅可以为插入 LONG 列的 L ...

  9. JavaScript内置对象

    对象概述 JavaScript是一种基于对象的脚本语句,而不是面向对象的编程语言.对象就是客观世界存在的实体,具有属性和方法两方面特性. 访问对象的属性和方法的方式如下: 对象名.属性 对象名.方法名 ...

  10. Adobe AIR and Flex - 实现堆栈容器

    1.需求描述: 在对云平台的监控中,我们经常需要在一张图上可视化的描述集群下的物理机所虚拟的虚拟机使用情况,以及超卖情况.那么传统的chart图就不满足我们的需求了,那么要实现这样一个定制化的char ...