码迷,mamicode.com
首页 > 移动开发 > 详细

iOS多线程技术---pthread、NSThread、NSOperationQueue、GCD

时间:2015-07-16 02:10:07      阅读:806      评论:0      收藏:0      [点我收藏+]

标签:

多线程技术

process进程:在系统中运行的一个应用程序;每个进程都是独立的;有专有的内存空间

thread线程:程序的一段执行序列,进程的不部分;

             特点:1、进程只分配内存空间,并不执行任务

                         2、每个进程至少有一个线程,该线程叫做主线程

                         3、线程是进程的基本执行单元,进程的所有任务都是在线程中执行

                         4、每个线程中得任务的执行都是串行的

 

多线程并发:一个进程中多条线程并发执行任务;

            特点:   1、提高程序的执行效率,提高资源利用率

                        2、同一时间,CPU只能处理一条线程

                        3、多线程并发时,CPU在多条线程间快速切换

                        4、线程切换的 速度很快,就造成了多线程的并发执行

                        5、开启线程需要内存空间,线程太多会造成调度消耗太多资源

                        6、线程过多会降低每条线程被调度的频率(线程执行效率降低)

 

多线程的应用:

        主线程:显示刷新UI界面、处理UI事件;耗时任务(如下载)放在子线程中

        判定方法在哪个线程中执行:NSLog(@“当前的线程:”,[NSThread currentThread]);

 

四种多线程技术:pthread   NSThread 

 

pthread

      基于c语言的API ,可编写多平台应用,使用难度大,需要手动创建销毁线程,可自定义功能少

pthread_t pthread;

void *task(void *data){

NSLog(@“当前子线程:%@“,NSThread currentThread];

return 0;

}

 

pthread_create(&pthread,NULL,task,NULL);

 

NSThread

基于OC,相对于pthread使用简单,面向对象

缺点:需要自己管理线程的生命周期,线程同步,加锁、开锁,管理多个线程比较困难

 

手动创建线程的三种方法:

1、NSThread实例方法:- (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(id)argument NS_AVAILABLE(10_5, 2_0);(只创建

2、NSThread类方法:+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument; (创建并运行

3、NSThread实例方法:- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg NS_AVAILABLE(10_5, 2_0);

注:selector: 线程执行的方法,这个selector只能由一个参数,而且没有返回值

        object: 传给target的唯一参数,也可以为nil

        target: selector消息发送的对象 只有第一个能设置名字、优先级

线程阻塞:

// sleep?法?:开始睡眠5秒钟

[NSThread sleepForTimeInterval:5];

// sleep?法二:

NSDate *date = [NSDate dateWithTimeIntervalSinceNow:3

[NSThread sleepUntilDate:date];

强制停止线程:

[NSThread exit];

其他常用方法:

+(NSThread *)mainThread; //获得主线程

-(BOOL)isMainThread;//判断是否是主线程

+(double)threadPriority;//获取线程优先级    优先级取值范围0.0~1.0 值越大优先级越高

+(BOOL)setThreadPriority:(double)p;//设置优先级

-(NSString*)name;//获取线程名字

-(void)setName:(NSString*)n;//设置线程名字

 

线程的状态:

New(新建) -> Runnable(就绪) --> cpu开始调度当前线程 ---> Running(运行) ---> 调用 sleep方法 ---> Blocked(阻塞) ---> 移除线程池 ---> sleep执行完毕/到时 ---> 进入线程 池 ---> Runnable(就绪)

如果线程任务执行完毕/异常/强制退出 ---> Dead(死亡)

加锁:

尽量避免使用@synchronized,也就是避免多个线程访问同一个资源,因为有了加锁、 解锁需要消耗比较大的cpu资源 

加锁的前提:多个线程同时访问同一个资源的时候才需要加锁(互斥锁) 

线程同步:多条线程在同一条线上执行(按顺序地执行任务) 

尽量讲加锁、资源抢夺的业务逻辑交割服务器端处理,减少移动客户端的压力

synchronized关键字

1、synchronized关键字的作用域有二种:

1)是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的 synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法;

2)是某个类的范围,synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。

 

2、除了方法前用synchronized关键字,synchronized关键字还可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。用法是: synchronized(this){},它的作用域是当前对象;

原子和非原子属性:

nonatomic: 非原子 —> 不会在set方法中加锁,这个是推荐方式,会占用资源少

atomic:原子 —> 在set方法中加锁,防止多个线程同时执行set方法

 

线程间的通讯:

1.在一个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 

2.线程间通讯的方式:

一个线程传递数据给另一个线程

在一个线程中执行完特定任务后,转到另一个线程继续执行任务

iOS多线程技术---pthread、NSThread、NSOperationQueue、GCD

标签:

原文地址:http://www.cnblogs.com/ChrisYu/p/4649968.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!