版权声明:原创作品,谢绝转载!否则将追究法律责任。
 
我们开发的应用基本上都是多线程的,几乎没有不是多线程的应用发布在appstore。首先我们的应用启动会默认有一个主线程,你一直在里面执行很多操作如果操作执行的时间很长,用户会马上关掉你的应用这不是你想看到的。我们可以采用多线程的技术创建一个辅助线程来把一些执行很长时间的操作放到这个辅助线程里。
 
下面我们看看几个术语
 
l 线程(线程)用于指代独立执行的代码段。
 
l 进程(process)用于指代一个正在运行的可执行程序,它可以包含多个线程。
 
l 任务(task)用于指代抽象的概念,表示需要执行工作。
 
我们可以这样理解:我们可以在电脑上开启多个QQ应用。每个QQ应用可以同时打开很多聊天的窗口。这里每个QQ是一个进程,然后每个QQ聊天窗口是一个QQ应用的一个线程。
 
现在我们可以大概了解多线程的概念了。但是我们真的要用多线程技术吗?或者说我们真的要编写多线程技术代码吗?为什么要这样问呢?
 
下面是我这样问的几点原因:
1:首先多线程技术是耗费资源的比如系统的内存和cpu的占用
2:多线程可能造成两个线程同时访问一块内存来造成资源争夺
3:刚才也说了多线程耗费宝贵的资源,你应该保证你多线程里面执行的操作运行时间长而且有效率。我们还得中断那些空闲的线程。这样有能降低我们应用的内存占用,来腾出内存给其他的应用。
4:线程之间的通信,有时候辅助线程可能要通知主线程做的工作怎么样了。这时候就用到了线程通信的技术。
5:线程的退出,一个线程执行完他的任务自然退出是最好的选择。但是有时候你强制退出一个线程会造成一些内存泄漏等潜在的安全问题。
6:如果你的一个线程突然因为什么原因抛出一个异常。你需要捕获异常,因为同一个进程的线程不能捕获其他线程的异常信息。我们必须把异常情况一个NSException对象从一个线程传递到另一个线程,向这个线程报告发生了什么,这样引发异常的线程可以继续执行(如果有可能),或者干脆退出。
7:线程浪费宝贵的资源我们需要提高他的效率需要专门一个run loop来处理要执行的事件,有时候还需要一个自动释放池来管理创建的一些临时对象。
 
这就是我们手动编写一个线程可能遇到的一些问题。因此自己写多线程代码是需要非常小心的。我们可以用其他的多线程代替的技术来做这样的工作,但是如果确实需要我们接下来也会介绍。
先说几个多线程的代替技术:
 
Grand Central DispatchGCD):
 
系统管理线程,你不需要编写线程代码。只需定义想要执行的任务,然后添加到适当的 dispatch queue。 GCD会负责创建线程和调度你的任务。系统直接提供线程管理,比应用实现更加高效。
 
Operation Queue
 
Objective-C对象,类似于 dispatch queue。你定义想要执行的任务,并添加任务到 operation queue,后者负责调度和执行这些任务。和 GCD一样, Operation Queue也管理了线程,更加高效
 
asynchronous functions:
系统的一些API接口给你提供了异步的功能自动支持并发功能。这些API也许用系统的机制和进程来创建自定义的线程来执行他们的任务并且返回结果给他们。一旦你设计应用,寻找提供异步功能的API接口来代替用同步放在自定义线程。
timers:
你可以用timers在你的应用主线程来执行周期性的任务这时需要一个线程是太微不足道了。但是仍然要提供每隔一段时间的服务。
 
还有一些其他的技术这里就不多做介绍。
下面一篇将介绍怎么创建线程并对创建的线程进行管理的操作。
 

IOS多线程之序的更多相关文章

  1. iOS多线程杂论

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

  2. iOS 多线程:『GCD』详尽总结

    本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法.这大概是史上最详细.清晰的关于 GCD 的详细讲解+总结的文章了.通过本文,您将了解到: 1. GCD 简介 2. GCD 任务和队列 ...

  3. iOS多线程主题

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

  4. iOS多线程技术方案

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

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

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

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

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

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

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

  8. iOS多线程

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

  9. iOS多线程学习及总结

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

随机推荐

  1. 核心动画——Core Animation

    一. CALayer (一). CALayer简单介绍 在iOS中,你能看得见摸得着的东西基本上都是UIView,比方一个button.一个文本标签.一个文本输入框.一个图标等等.这些都是UIView ...

  2. 查看eclipse版本信息

    http://www.cnblogs.com/caiyuanzai/archive/2013/01/11/2855796.html 如果要查询eclipse数字版本号的话,可按如下进行操作: 1. 找 ...

  3. Spring7种事务传播行为类型--PROPAGATION_REQUIRED及其他6种事务传播行为种类

    PROPAGATION_REQUIRED及其他6种事务传播行为种类,有需要的朋友可以参考下. Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务 ...

  4. 【转】Asp.net MVC 通过自定义ControllerFactory实现构造器注入(重写DefaultControllerFactory)

    [转]Asp.net MVC 通过自定义ControllerFactory实现构造器注入 一.重写ControllerFactory的GetControllerInstance ControllerF ...

  5. JS jQuery json日期格式问题的办法

    原生JS:Date对象详细参考 Date对象:基于1970年1月1日(世界标准时间)起的毫秒数 本文参考MDN做的详细整理,方便大家参考MDN 构造函数: new Date(); 依据系统设置的当前时 ...

  6. [转]仿91助手的PC与android手机通讯

    仿91助手的PC与android手机通讯 原文 知道91助手和豌豆莢吧? 说到这两个东西,最让人好奇的应该是就是和手机的交互了.我之前有研究过电脑和安卓的交互,基本功能已经走通了,在这里我想分享一下. ...

  7. 一键切换hosts文件

    1.新建文件host.bat 2.代码 @echo off cd.>C:\Windows\System32\drivers\etc\hosts echo .本地环境 .线上测试环境 ,切换Hos ...

  8. ul li列表元素浮动导致border没有底边解决办法

    如图,当ul li,li元素浮动,并且ul元素也overflow:hidden清除浮动的时候,给li元素加了border,但是不显示底边,这时候要看是不是没有给li元素加高,因为加了border之后默 ...

  9. 1. BeeGo 介绍与项目的创建,启动

    简介 BeeGo是一个快速开发Go而应用的HTTP框架,他可以用来快速开发API,web以及后端服务等各种应用,是一个restful 的框架,主要涉及灵感来源于tornado,sinatr和flask ...

  10. 让 Oracle 11g 32位运作在64位 Windows 上

    并非不能运行. 本人安装版未曾尝试,但绿色版倒是运行成功了. 很简单:注册表的位置发生了变化而已! 默认(32位.64位),oracle会读取以下注册表的位置:      [HKEY_LOCAL_MA ...