多线程
1.程序是一个可执行文件
2.进程是程序执行的一个操作实体
3.进程是线程的集合
4.多线程就是在一个程序(一个进程)中开启多条线路,为并发执行多个任务提供方便.
什么是线程?
1.进程当中并发执行的代码片段
2.线程是提高代码效率的一个手段
3.IOS中主要用于防止界面假死
4.线程是处理异步任务的主要手段
===============================
NSThread
1.+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;
作用:开启并且执行一个线程
2.- (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(id)argument
作用:创建一个线程但是不会执行,需要手动调用
调用方法:[thread start];
3.NSThreadWillExitNotification
作用:通过通知中心监听此消息达到监听线程结束的目的
4.NSlock
作用:线程锁
#import "ViewController.h" @interface ViewController () @property (nonatomic,assign)NSInteger count; - (IBAction)btnAction:(UIButton *)sender; @property (nonatomic,strong)NSLock *lock;//成员变量的线程锁 @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.lock = [NSLock new]; } - (IBAction)btnAction:(UIButton *)sender { //开启线程 NSThread *thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil]; thread1.name = @"1号线程"; //NSThread *thread2 = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil]; //thread2.name = @"2号线程"; [thread1 start]; //[thread2 start]; [self performSelector:@selector(cancel:) withObject:thread1 afterDelay:1.5f]; } //取消线程 -(void)cancel:(NSThread *)sender{ NSLog(@"cancel"); //cancel给线程挂上取消的标志位 [sender cancel]; } -(void)refreshView{ self.view.backgroundColor = [UIColor orangeColor]; } -(void)doSomething:(id)sender{ //回到主线程去刷新UI [self performSelectorOnMainThread:@selector(refreshView) withObject:nil waitUntilDone:NO]; //同时只能有一个线程操作锁内的代码片段,如果有线程占用此代码段,其它线程只能在锁外等待 [self.lock lock]; for (NSInteger i = 0; i < 10; i++) { //判断一下线程是否被挂上cancel标志位 if ([[NSThread currentThread] isCancelled]) { //手动退出线程 [NSThread exit]; } _count++; NSLog(@"%@执行了%ld",[[NSThread currentThread] name],_count); [NSThread sleepForTimeInterval:1.0f]; } [self.lock unlock]; } @end
5.如何取消NSThread
http://images.cnblogs.com/cnblogs_com/kenshincui/613474/o_14.jpg
===============================
NSOperation
1. NSOperation本身不是线程,它是一个线程操作
2.它常用的子类
1)NSInvocationOperation 通过方法指定线程要执行的任务
2)NSBlockOperation 通过block指定要执行的任务
3)可以继承NSOperation,然后重写main函数达到自定义任务的效果
3.NSOperationQueue 线程池,管理线程
可以设置最大开启的线程数 maxConcurrentOperationCount
如果设置为1,则成为串行队列,否则,为并发队列
@implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //实例化一个线程操作对象 NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doSomthing:) object:nil]; //设置如果线程执行完毕以后,回调的block函数 [op1 setCompletionBlock:^{ NSLog(@"op1执行完毕"); }]; //带block的NSOperation NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{ //线程需要执行的代码 NSLog(@"op2正在执行"); }]; [op2 setCompletionBlock:^{ NSLog(@"op2执行完毕"); }]; MyOperation *op3 = [MyOperation new]; [op3 setCompletionBlock:^{ NSLog(@"op3执行完毕"); }]; //添加到线程池(队列) NSOperationQueue *queue = [NSOperationQueue new]; //只允许开启一个线程 //此时会变成串行任务 queue.maxConcurrentOperationCount = 1; //添加到线程池之后,就会自动开启线程,默认是并发执行任务 [queue addOperation:op1]; [queue addOperation:op2]; [queue addOperation:op3]; } -(void)doSomthing:(id)sender{ NSLog(@"op1正在执行"); }
===============================
GCD
1.什么是GCD
GCD 是苹果iOS4.0之后和block一起出现的技术,是苹果封装的更底层(c)更高效的多线程处理技术,GCD (grand-central-dispatch)是目前使用的最普遍的多线程处理技术,因为高效、简洁、实用
2.GCD的队列类型
1).主线程队列 dispatch_get_main_queue()
2).子线程队列 dispatch_get_global_queue(0, 0)
3.一次性执行(类似线程锁) static dispatch_once_t onceToken
Singleton为自定义的一个继承NSObject的类,时机应用中需要什么类型就写什么类型
4.延时执行 dispatch_time_t ,dispatch_after
5.自定义队列dispatch_queue_create
注意:自定义队列只开启一条线程,执行多个任务时为串行队列
如下打印出来的结果都在线程"number = 2"中执行
6.分组合并dispatch_group_create