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");
}