您的位置:首页 > 移动开发 > IOS开发

ios中的多线程的用法总结

2014-06-05 16:56 211 查看
ios中的多线程的用法总结



1、进程的基本概念

(1)每一个进程都是一个应用程序,都有独立的内存空间,一般来说一个应用程序存在一个进程,但也有多个进程的情况

(2)同一个进程的线程共享内存中的内存和资源

2、多线程的基本概念

(1)每一个程序都有一个主线程,程序启动时创建(调用main来启动)。

(2)多线程技术表示,一个应用程序有多个线程,使用多线程能提供CPU的利用率,防止主线程被堵塞。

(3)任何有可能堵塞主线程的任务不要在主线程执行(如:访问网络)。

(4)主线程的生命周期和应用程序绑定着,程序退出(结束)时,主线程也结束。

3、多线程的创建

/* 方法一*/
//第一种开启新的线程调用 threadFunction
NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(threadFunction) object:nil];
[thread start];

/*方法二:*/
[NSThread detachNewThreadSelector:@selector(threadFunction) toTarget:self withObject:nil];

/*方法三:*/
[self performSelectorInBackground:@selector(threadFunction) withObject:nil];

/*方法四:*/
NSOperationQueue *operationQueue = [[NSOperationQueue alloc]init];
[operationQueue addOperationWithBlock:^(void){
for (int i = 0; i<50; i++) {
NSLog(@"多线程的运行");
}

}];

/*方法五:*/
//创建一个线程队列
NSOperationQueue *operationQueue = [[NSOperationQueue alloc]init];
//设置线程执行的并发数
operationQueue.maxConcurrentOperationCount = 1;
//创建一个线程操作对象
NSInvocationOperation *operation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(mutableThread1:) object:nil];
NSInvocationOperation *operation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(mutableThread2:) object:nil];
//设置线程的优先级
operation2.queuePriority = NSOperationQueuePriorityHigh;
//将线程添加到线程队列中去
[operationQueue addOperation:operation1];
[operationQueue addOperation:operation2];
}

/*第六种方法*/


GCD

GCD是Grand Central Dispatch的缩写,是一系列的BSD层面的接口,在Mac 10.6 和iOS4.0以后才引入的,且现在NSOperation和NSOperationQueue的多线程的实现就是基于GCD的。目前这个特性也被移植到 FreeBSD上了,可以查看libdispatch这个开源项目。

//创建一个队列
dispatch_queue_t queue =
dispatch_queue_create("test",
NULL);
//创建异步进程
dispatch_async(queue, ^{
dispatch_sync(dispatch_get_main_queue(),^{

});
});

4、NSRunLoop的用法

(1)Runloop是与线程有关的基础框架的一部分,是用来规划事件处理的,当有任务的时候Runloop会让线程处理任务,当没有任务的时候Runloop会让线程处于休眠状态。

(2)Runloop的管理不完全是自动的,我们必须在合适的时候开启Runloop和处理到达的事件,Cocoa和Core Foundation都提供了Runloop对象来配置和管理线程的Runloop。我们的应用程序不需要显示的创建这些对象,包括应用主线程在内的每一个线程都有一个相关的Runloop对象。而且只有第二线程是需要显示地运行Runloop,主线程是不需要的,APP把主线程Runloop的配置和运行作为了应用程序启动的一部分。
(3)NSRunLoop可以一直保持一个线程一直为活跃状态,不会马上销毁掉。
(4)操作Runloop的两个接口: 1.NSRunLoop Class Reference 2.CFRunLoop
Reference

5、定时器在多线程的使用
在多线程中使用定时器必须开启RunLoop,因为只有开启RunLoop保持线程为活动状态,才能保持定时器能不断执行。
代码:
[self
performSelectorInBackground:@selector(makeThread )
withObject:nil];

- (void)mulitiThread{

/*方法一:此方式创建的timer添加至NSRunLoop*/
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeAction) userInfo:nil repeats:YES];
//开启NSRunLoop来使线程保持存活状态
[[NSRunLoop currentRunLoop]run];
*/

/*方法二:此方式创建的timer没有添加至NSRunLoop*/
NSTimer *timer = [NSTimer
timerWithTimeInterval:1
target:self
selector:@selector(timeAction)
userInfo:nil
repeats:YES];
[[NSRunLoop
currentRunLoop]addTimer:timer
forMode:NSDefaultRunLoopMode];
[[NSRunLoop
currentRunLoop]run];
NSLog(@"线程结束");
}

- (void)timeAction{
NSLog(@"timeAction");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: