多线程的实现
NSThread
方法一:
- (void)viewDidLoad { [super viewDidLoad]; NSThread * thread = [[NSThread alloc]initWithTarget:self selector:@selector(test:) object:@"fuck"]; [thread start]; } - (void)test:(NSString *)string { for (int i = 0; i < 100; i ++) { NSLog(@"%@,%d",string,i); } }
方法二:
- (void)viewDidLoad { [super viewDidLoad]; //这种比较快速,不用调用start方法。 [NSThread detachNewThreadSelector:@selector(test:) toTarget:self withObject:@"you"]; } - (void)test:(NSString *)string { for (int i = 0; i < 100; i ++) { NSLog(@"%@,%d",string,i); } }
方法三:使用较多
- (void)viewDidLoad { [super viewDidLoad]; //这个方法是从NSObject继承下来的,所有对象都可以通过这个方法快速创建一个线程去执行test中的方法。 [self performSelectorInBackground:@selector(test:) withObject:@"哈哈"]; } - (void)test:(NSString *)string { for (int i = 0; i < 100; i ++) { NSLog(@"%@,%d",string,i); } }
NSThread常用方法:
[NSThread isMainThread];//是否是主线程 [NSThread isMultiThreaded];//是否是多线程(其他线程)
[NSThread sleepForTimeInterval:2.0];//让当前线程睡眠2秒
[NSThread exit];//退出当前线程
NSOperationQueue(线程池)
方式一:
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSOperationQueue * optionQueue = [[NSOperationQueue alloc]init];//创建线程队列
//创建一个线程 NSInvocationOperation * operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(fuckMan:) object:@"1"];
//添加到线程池中,并执行 [optionQueue addOperation:operation];
} - (void)fuckMan:(NSString *)str { NSLog(@"haha"); }
方式二:
//创建一个线程队列(线程池,存放很多条线程的池子)
NSOperationQueue * optionQueue = [[NSOperationQueue alloc]init]; [optionQueue addOperationWithBlock:^{ for (int i = 0; i < 100; i ++) { NSLog(@"Thread 1 ----- %d",i); } }];//使用block的方式初始化一个线程对象,并让这个线程对象执行。
主线程的使用:
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSOperationQueue * optionQueue = [[NSOperationQueue alloc]init]; NSInvocationOperation * operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(fuckMan:) object:@"1"]; [optionQueue addOperation:operation]; operation.queuePriority = NSOperationQueuePriorityVeryHigh;//设置线程的优先级为最高 optionQueue.maxConcurrentOperationCount = 2;//设置线程池中最大有两个线程能处于运行状态 } - (void)fuckMan:(NSString *)str { NSLog(@"haha"); [NSThread isMainThread];//是否是主线程 //用主线程执行 [self performSelectorOnMainThread:@selector(mainThread) withObject:nil waitUntilDone:NO]; } - (void)mainThread { if([NSThread isMainThread]) { NSLog(@"我是一个主线程!"); } }
使用NSOperationQueue线程队列的好处:
NSOperationQueue: optionQueue.maxConcurrentOperationCount = 2;//设置线程池中最大有两个线程能处于运行状态 NSOperation: operation.queuePriority = NSOperationQueuePriorityVeryHigh;//设置线程的优先级为最高
GCD实现多线程(主流),使用这种方式可以提高代码的执行效率与多核的利用率。
GCD的好处
1.可以更好提高多核利用率
2.block方式实现,简单快速。
NSOperationQueue的好处
1.可以控制线程最大数。
2.可以控制线程的先后顺序。
队列的规则是先进先出,只有前面的那个任务运行完了后面的才能继续运行。
串行队列,它会保证队列的第一个任务执行完毕后才会执行第二个。
串行队列中放入一个同步任务,它会按顺序执行队列中的任务,并且是有主线程执行,不会开启新的线程。
串行队列中放入一个异步任务,它会按顺序执行队列中的任务,并且由新创建的一个线程来执行。(使用很多,因为需要创建一个新的线程来按顺序执行多个任务这种情况很常见)
并行队列,是队列它必须符合先进先出的规则,但它的先进先出是让前面的几个任务按顺序拥有执行权限(并非按顺序执行),至于并行队列一次会让几个任务有执行权限是由队列自动管理的,分配了执行权限的那些任务的执行顺序是由操作系统来调度的。(只对放入的异步任务有效)
并行队列中放入一个同步任务,在主线程中按顺序执行里面的所有任务。
并行队列中放入多个异步任务,新开多线程分别对应执行多条任务。