IOS多线程(一)
一。绪论
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多线程(一)的更多相关文章
- iOS多线程主题
下面是:2个并发进程.和2个并发线程的示意图: 下面介绍三种多线程技术(Thread.Cocoa Operation.Grand Central Dispatch): 1.最轻量级Thread(需要自 ...
- iOS多线程技术方案
iOS多线程技术方案 目录 一.多线程简介 1.多线程的由来 2.耗时操作的模拟试验 3.进程和线程 4.多线程的概念及原理 5.多线程的优缺点和一个Tip 6.主线程 7.技术方案 二.Pthrea ...
- iOS 多线程GCD的基本使用
<iOS多线程简介>中提到:GCD中有2个核心概念:1.任务(执行什么操作)2.队列(用来存放任务) 那么多线程GCD的基本使用有哪些呢? 可以分以下多种情况: 1.异步函数 + 并发队列 ...
- iOS多线程到底不安全在哪里?
iOS多线程安全的概念在很多地方都会遇到,为什么不安全,不安全又该怎么去定义,其实是个值得深究的话题. 共享状态,多线程共同访问某个对象的property,在iOS编程里是很普遍的使用场景,我们就从P ...
- iOS多线程的详情使用示例--简进祥
大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能 ...
- iOS多线程
关于iOS多线程 概述 这篇文章中,我不会说多线程是什么.线程和进程的区别.多线程有什么用,当然我也不会说什么是串行.什么是并行等问题,这些我们应该都知道的. 在 iOS 中其实目前有 4 套多线程方 ...
- iOS多线程学习及总结
能有份网上的存储资料,备以后提升及参考 iOS 多线程编程 简介 一. iOS有三种多线程编程的技术,分别是: 1. NSThread 2. Cocoa NSOp ...
- iOS多线程杂论
iOS多线程的分布 (1) NSThread (2) NSOperation (3) GCD 现在对下面三个进行一个个的分析,希望那里说得不对的地方希望简友们帮我指点一二. 1,NSThread 优点 ...
- iOS多线程开发
概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操 ...
- iOS多线程编程之NSThread的使用
目录(?)[-] 简介 iOS有三种多线程编程的技术分别是 三种方式的有缺点介绍 NSThread的使用 NSThread 有两种直接创建方式 参数的意义 PS不显式创建线程的方法 下载图片的例子 ...
随机推荐
- 第6章 System V消息队列
6.1 概述 System V消息队列在内核中是list存放的,头结点中有2个指针msg_first 和msg_last.其中每个节点包含:下个节点地址的指针.类型.长度.数据等. 6.2 函数 6. ...
- 在Windows 7上安装MongoDB 2.6.7
sc.exe create MongoDB binPath= "C:\mongodb\bin\mongod.exe --service --config=\"C:\mongodb\ ...
- java中json包的使用以及字符串,map,list,自定义对象之间的相互转换
做一个map和字符串的转换,需要导入这些jar包,这是最基本的一些jar包. 经过多方尝试得出结论入下: 首先导入基本包:json-lib-2.2.3-jdk15.jar 如果没有这个jar包,程序是 ...
- 把exe嵌入到自己的exe中。delphi xe3
下面是一个把exe程序嵌入到我们自己的exe中.开发环境 Delphi XE3 Version 17.0.4625.53395.OS环境WIN7 SP1,由于xe3版本的引用库发生变化.换成其他版本的 ...
- Sqlserver中存储过程,触发器,自定义函数
Sqlserver中存储过程,触发器,自定义函数: 1. 触发器:是针对数据库表或数据库的特殊存储过程,在某些行为发生的时候就会被激活 触发器的分类: DML触发器:发生在数据操作语言执行时触发执行的 ...
- 在开发板Linux上挂载"驱动"挂载不成功,出现提示server 172.27.52.100 not responding, still trying
1.在开发板具体操作步骤如下: 1.1 :设置IP ifconfig eth0 172.27.52.200 1.2 :ping通 虚拟机Linux 主机Linux ping XXX.XXX.X ...
- null 之AddAll、Add和Boolean
@Test //failed public void TestListAddAll(){ List<TravelerInfo> travelerInfoSummary=new ArrayL ...
- python3 AttributeError: 'NoneType' object has no attribute 'split'
from wsgiref.simple_server import make_server def RunServer(environ, start_response): start_response ...
- Hibernate三种状态的区分,以及save,update,saveOrUpdate,merge等的使用 引自http://www.blogjava.net/TiGERTiAN/archive/2008/10/25/236519.html
Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached).处于持久态的对象也称为PO(Persistence Object ...
- XBox360-双光盘游戏自制GOD
一直在找极限竞速4(Forza4),虽然这个版本比较老,但因为带体感.终于下到了,可惜是2个ISO.试着自己做GOD.用到两个软件:Iso2God和Xbox Backup Creator(俗称XBC) ...