线程
我的线程学习:
基本了解:(http://www.cnblogs.com/wendingding/p/3805088.html)
进程:指系统中正在运行的一个应用程序。每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间。
线程:1个进程若要执行任务,必须有一个以上的线程。
线程的串行:按照顺序的一个一个的执行任务。
多线程:1个进程中可以开启多条线程,每天线程可以并行(同时)执行不同的任务。多线程可以提高程序的执行效率。{例如同时开三条线程分别下载三个文件就输入并行}
多线程的原理:同一时间CPU职能处理1天线程,只有1条线程在工作(执行) 。
多线程并发(同时)执行,其实是CPU快速的在多条线程之间调度(切换)。
如果CPU的速度足够快就会造成多线程并发执行的假象。
每条线程的执行效率变低,消耗大量CPU资源。
多线程的优缺点:
优点:能适当的提高执行效率。
能适当的提高资源利用率(CPU、内存利用率)
缺点:开线程需要占用一定的内存空间(默认情况下,祝线程占用1M,自线程占用512KB)
如果开启大量的线程,会占用大量的内存空间,降低程序的性能。
线程越多,CPU在调度上的开销越大。
程序设计更加复杂:比如线程之间的通信,多线程的数据共享。
多线程在iOS开发中的应用
主线程:一个iOS程序运行后,默认会开启1条线程,称为“主线程”或“UI线程”
主线程的主要作用:显示\刷新UI界面
处理UI事件(比如点击事件,滚动事件,拖拽事件等等)
主线程的使用注意:别将比较耗时的操作放到主线程。
耗时操作会卡住主线程,严重影响UI的流畅度,给用户一种“卡”的体验。
iOS多线程编程之NSThread的使用 (http://blog.csdn.net/totogo2010/article/details/8010231)
1.iOS三种多线程编程的技术,分别是:
NSTread
Cocoa NSOperation
GCD 全称:Grand Central Dispath
这三种编程方式从上到下,抽象层度是从低到高的,抽象越高的使用越简单,也是Apple最推荐使用的。
三种方式的优缺点:
NSThread
优点:NSThread 比其他两个轻量级。
缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的枷锁会有一定的系统开销。
NSThread实现的技术有下面三种:
Cocoa threads
POSIX threads
Multiprocessing Services
一般使用的是:cocoa thread
cocoa operation
优点:不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上。
cocoa operation 相关的类是:NSOperation,NSoperationQueue。NSOperation是一个抽象类,
使用它必须用它的子类,可以实现它或者使用它定义好的子类:SNInvocationOperation
和NSBlockOperation。创建NSOperaton子类的对象,把对象添加到NSOperationQueue队列,
把对象添加到NSOperationQueue队列里执行。
GCD
Grand Central Dispatch(GCD)是Apple开发的一种多核编程的解决的方法。在iOS4.0开始之后使用。
GCD是一个替代诸如:NSTread、NSOperationQueue,NSinvocationOperation等技术的很高效和强
大的技术。
NSThread的使用
NSThread有两种直接创建的方式:
- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument
+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:
(id)anArgument
第一个是实例方法,第二种是类方法。
{
1、[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self
withObject:nil];
2、NSThread* myThread = [[NSThread alloc] initWithTarget:self
selector:@selector(doSomething:)
object:nil];
[myThread start];
}
参数的意义:
selector:线程执行的方法,这个selector职能有一个参数,而且不能有返回值。
target:selector消息发送的对象
argument:传输给target的唯一的参数,也可以为nil
第一种方法直接创建线程并且开始运行,第二种方式是先创建线程对象,然后运行线程操作,在运行操作之前可以设置
线程的优先级等线程信息。
线程之间的通信
线程加载完成之后刷新页面(重走了一次主线程的UI)
[self performSelectorOnMainThread:@selector(updateUI:) withObject:image
waitUntilDone:YES];
线程同步:
在一个线程执行的时候对线程加锁,在线程结束的时候对线程解锁。(两个人对同一张银行卡进行取款操作,
如果未进行同步的话,两个人可以同时对银行卡进行操作。)
线程的执行顺序:
可以使用[ticketsCondition signal];发送信号的方式,在一个线程唤醒另外一个线程的等待。
线程加锁、解锁、等待、唤醒
[ticketsCondition lock];
[ticketsCondition unlock];
[ticketsCondition wait];
[ticketsCondition signal];
demo地址:http://download.csdn.net/detail/totogo2010/4591149

浙公网安备 33010602011771号