3.OC中三种线程方式总结

来源:互联网 发布:硬盘ntfs 可复制 mac 编辑:程序博客网 时间:2024/06/05 14:12

1.说明
开始看的时候还是蛮排斥的,认为OC中的线程封装的不灵活,现在不这样认为了。
C++服务器中多线程:多为提高程序的性能,并发行,或者在结构上进行任务分离,解除业务之间的耦合性,每个线程相当于一个批处理器,对大量相同协议的数据进行处理。生存周期很长,当数据交叉的时候,会涉及到大量的线程同步。
OC中多线程:以任务为单位,将耗时的操作交给其他线程,不阻塞当前线程,所以生存周期也在任务结束后就完成了。线程同步相对较少。

2.OC中3种线程封装模式
不得不说OC中的线程库封装的抽象层次更高,用法也就更简单,
优先级高的线程被调度次数会多一些,有2个重要属性,name和priority
NSThread NSOperation GCD 三种
2.1NSThread
NSThread创建线程提供了2种方法
方法1:
NSThread* thrd =[ [NSThread alloc] initWithTarget:self selector:@selector(third_fun), object:self];
[thrd setName:@“test1”];
[thrd setThreadPriority:0.7];
[thrd start]; //开始运行
方法2:
[NSThread detachNewThreadSelector:@selector(thrid_run) toTarget:self withObject:self];  //此处创建的线程是直接运行的 用start
其他一些操作:
[NSThread currentThread];
[thrd cancle];
if ([NSThread currentThread].isCancelled)
{
[NSThread exit]; //终止当前正在执行的线程
}
[NSThread sleepForTimeInterval:0.5]; //当前线程休眠0.5秒
三种线程同步方式
1.同步监视器(synchronized)
用法@synchronized(obj)
{
//obj 是需要线程安全的对象,不能是基类的数据类型
//线程安全
//当return,goto等非正常结束时,会释放监视器
}
2.NSLock方式
用法:NSLock* lock = [[NSLock alloc] init];
[lock lock];
[lock unlock];
和互斥锁用法很类似,高于互斥锁的封装
3.NSCondition条件变量
内部实现了NSLocking协议,和条件信号量功能很类似
方法有: -wait - signal -broadcast -lock -unlock
用法: NSCondition* cond =[ [NSCondition alloc] init];
[cond lock];
[cond wait];
[cond broadcast]     1
[cond unlock]; 2  个人认为这两个步骤可能需要调换下
 
2.2GCD(grand central dispatch) 模式
说明:相对于NSThread是一种更好层次的封装,对外提供了一个任务队列,屏蔽了底层的线程调度过程。所以用户只需要创建队列,向不同类型的队列提交任务即可。创建的队列标识符类型为dispatch_queue_t。
对列:串行队列,并发队列,全局队列,主线程串行队列
1.队列创建
串行队列:任务依次执行
dispatch_queue_t serial = dispatch_queue_create(“fkjava.queue”, DISPATCH_QUEUE_SERIAL);
并行队列:底层有多个线程同时运行提交的多个任务,但是一个任务是一个线程,多个任务有多个线程,底层实现被屏蔽了
dispatch_queue_t concur = dispatch_queue_create(“fkios.queue”, DISPATCH_QUEUE_CONCURRENT); 
获取住线程串行对列
dispath_queue_t mainque = dispatch_get_main_queue();
获取系统默认的全局队列
dispath_queue_t global = dispatch_get_global_queue
(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
全局并发队列的几种模式
DISPATCH_QUEUE_PRIORITY_HIGH 2
DISPATH_QUEUE_PRIORITY_DEFAULT 0
DISPATH_QUEUE_PRIORITY_LOW -2
DISPATH_QUEUE_PRIORITY_BACKGROUND
通过队列的优先级指定了任务的优先级
2.任务提交
提交任务分为同步还是异步,同步:任务交给其它线程,当前线程阻塞,异步:任务交给其它线程,线程调用返回
系统提供的部分接口
异步提交:
代码块方式
void dispatch_async(dispath_queue_t, dispatch_block block);
回调函数方式 
回调函数类型  -(void) call_back)(void*)
void dispatch_async_f(dispatch_queue_t, void* context, dispatch_function_t work);
同步提交
void dispatch_sync(dispatch_queue_t, dispatch_block block);
…..
多次执行
void dispatch_apply(size_t, dispatch_queue_t, void(^block)(size_t));
……
执行一次
void dispatch_once(dispatch_once_t* , dispath_block_t);
3.总结和其它API
用法很简单和方便,但不清楚内部调用机制
GCD采用的是C语言封装格式
2.3 NSOperation和NSOperationQueue
说明:感觉这是在GCD上进行的更高层次的封装,GCD还保留有面相过程,而NSOperation则是面相对象,更友好,但内部思想是一样的
NSOperation代表一个任务,而NSOperationQueue则是一个维护任务的队列。
1. NSOperationQueue提供的接口有
+ currentQueue:返回执行当前operation的NSOperationQueue队列
+ mainQueue:获取住线程的队列,提交的任务将会有住线程执行
-(void)addOperation 添加任务到当前队列
- setMaxConcurrentOperationCount:(NSInteger)count;设置队列最大的并发量
- setSuspended:(BOOL) 设置队列暂停任务调度
…….
2.NSOperation
任务封装通常采用NSOperation的子类,有3种方式,NSInvocationOperation, NSBlockOperation,重载NSOperation,重写main函数 

3.和主线程交互方法
OC中UI线程也被称为主线程,其它线程是不能够直接操作UI的,否则涉及到线程同步,这个时候其它线程需要把准备好的数据交给主线程,由住线程去操作。所以就涉及到和主线程交互
方法1 函数形式调用
//第三个参数为是否等待主线程结束才返回
[self performsSelectorOnMainThread:@selector(updateui:) withObject:image waitUntilDone:YES];
方法2(GCD) 封装成任务方式提交给任务队列
  dispatch_queue_t mainQue = dispatch_get_main_queue();
dispatch_async(mainQue, ^(void){
……});
方法3:
NSOperationQue* que = [NSOperation mainQueue];
NSBlockOperation* oper = [NSBlockOperation blockOperationWithBlock^{
….
}];
[que addOperation:oper];

















0 0
原创粉丝点击