多线程有4种

NSObject---NSObject自带的,但是他不能对数据进行保护

NSThread ---过于复杂,使用起来不够方便

NSOperationQueue ---操作队列,管理线程,内部有一个线程池,负责对现有的线程进行管理/重用

GDC(grand central dispatch); ----基于C的多线程解决方案

队列有两种(串行/并行)


MainViewController.m


#import"MainViewController.h"#import"MyOperation.h"@interfaceMainViewController()@property(nonatomic,retain)UIImageView*p_w_picpathView;@end@implementationMainViewController-(id)initWithNibName:(NSString*)nibNameOrNilbundle:(NSBundle*)nibBundleOrNil{self=[superinitWithNibName:nibNameOrNilbundle:nibBundleOrNil];if(self){//Custominitialization}returnself;}-(void)viewDidLoad{[superviewDidLoad];//Doanyadditionalsetupafterloadingtheview.UIButton*button=[[UIButtonalloc]initWithFrame:CGRectMake(110,100,100,30)];[buttonsetTitle:@"按钮"forState:UIControlStateNormal];button.backgroundColor=[UIColororangeColor];button.layer.cornerRadius=5;[self.viewaddSubview:button];[buttonaddTarget:selfaction:@selector(GCDAction:)forControlEvents:UIControlEventTouchUpInside];[buttonrelease];self.p_w_picpathView=[[UIImageViewalloc]initWithFrame:CGRectMake(40,150,240,300)];self.p_w_picpathView.backgroundColor=[UIColorcyanColor];[self.viewaddSubview:self.p_w_picpathView];[_p_w_picpathViewrelease];}-(void)buttonClick:(UIButton*)button{NSLog(@"判断当前线程是不是主线程%d",[NSThreadisMainThread]);//让当前的线程休眠3秒[NSThreadsleepForTimeInterval:3];NSLog(@"休眠结束");NSLog(@"当前线程:%@",[NSThreadcurrentThread]);inta=0;for(inti=0;i<600000000;i++){a++;}NSLog(@"%d",a);}-(void)NSObjectAction:(UIButton*)button{//1.多线程的实现方式:NSObject自带的//绑定一个方法,然后给他一个参数优点:简介快速,缺点:不能对数据进行保护[selfperformSelectorInBackground:@selector(buttonClick:)withObject:button];}-(void)threadAciton:(UIButton*)button{//2.NStrread类//这个类ude一个对象,就代表一个线程优点:可以控制线程的所有方面缺点:太复杂,使用起来不方便NSThread*thread=[[NSThreadalloc]initWithTarget:selfselector:@selector(buttonClick:)object:button];thread.name=@"刘亚芳";//开始执行子线程[threadstart];[threadrelease];}-(void)operationAction:(UIButton*)button{//NSOperation类//本身不能够实现多线程操作,代表一个任务(进程),安排在某个线程里面MyOperation*opreation=[[MyOperationalloc]init];//开始执行任务,执行的任务会在当前执行[opreationstart];[opreationrelease];//NSInvocationOperation*op1=[NSInvocationOperationalloc]initWithTarget:<#(id)#>selector:<#(SEL)#>object:<#(id)#>//NSBlockOperation*op2=[NSBlockOperationblockOperationWithBlock:<#^(void)block#>]}-(void)poerationQueueAction:(UIButton*)button{//NSOperationQueue操作队列(管理线程,线程池)队列有两类:(并行/串行)//内部有一个线程池,负责对现有的线程进行管理/重用//创建一个新的队列//主队列是一个串行队列NSOperationQueue*queue=[[NSOperationQueuealloc]init];//设置一个最大并发数(如果最大并发数为1,那么就为串行,否则为并行)[queuesetMaxConcurrentOperationCount:1];//向队列中添加任务MyOperation*op1=[[MyOperationalloc]init];MyOperation*op2=[[MyOperationalloc]init];MyOperation*op3=[[MyOperationalloc]init];MyOperation*op4=[[MyOperationalloc]init];[queueaddOperation:op1];[queueaddOperation:op2];[queueaddOperation:op3];[queueaddOperation:op4];[op1release];[op2release];[op3release];[op4release];}-(void)GCDAction:(UIButton*)button{//GCD:grandcentraldispatch基于C的多线程解决方案//1.创建一个调度队列//参数1:队列名字参数2:队列的类型(串行/并行)//DISPATCH_QUEUE_CONCURRENT---并行队列//DISPATCH_QUEUE_SERIAL---串行队列dispatch_queue_tmyQueue=dispatch_queue_create("liuyafang",DISPATCH_QUEUE_SERIAL);//2.使用的队列//参数1:要在哪个队列执行参数2:要执行的内容dispatch_async(myQueue,^{//任务1[selfbuttonClick:button];});dispatch_async(myQueue,^{//任务2NSLog(@"===========");});//使用系统的队列//系统提供了5个队列,1个串行队列(主队列),4个并行队列(全局队列)//获取系统的主队列dispatch_queue_tmainQueue=dispatch_get_main_queue();dispatch_async(mainQueue,^{//执行在主队列中要做的任务//全部的UI任务(reloadDate,给试图赋值)});//获取全局队列//参数1:获取哪一个全局队列参数2:给未来使用的(必须填写0)dispatch_queue_tglobalQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);//GCD的常见用法//在全局队列中请求数据dispatch_async(globalQueue,^{NSString*str=@"https://cache.yisu.com/upload/information/20200312/67/251264.jpg";NSURL*url=[NSURLURLWithString:str];//请求网络地址数据的同步方法//因为这个方法在子线程(全局队列)中执行,所以不需要考虑死线程的问题NSData*data=[NSDatadataWithContentsOfURL:url];UIImage*p_w_picpath=[UIImagep_w_picpathWithData:data];//所有刷新UI的操作都必须回到主队列进行(跳回到子线程)dispatch_async(mainQueue,^{self.p_w_picpathView.p_w_picpath=p_w_picpath;});});dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(int64_t)(4*NSEC_PER_SEC)),dispatch_get_main_queue(),^{NSLog(@"乔老爷不该死啊!!!");});//一段代码值执行一次,(单列的创建)staticdispatch_once_tonceToken;dispatch_once(&onceToken,^{NSLog(@"只执行一次");});}-(void)dealloc{[_p_w_picpathViewrelease];[superdealloc];}-(void)didReceiveMemoryWarning{[superdidReceiveMemoryWarning];//Disposeofanyresourcesthatcanberecreated.}/*#pragmamark-Navigation//Inastoryboard-basedapplication,youwilloftenwanttodoalittlepreparationbeforenavigation-(void)prepareForSegue:(UIStoryboardSegue*)seguesender:(id)sender{//Getthenewviewcontrollerusing[seguedestinationViewController].//Passtheselectedobjecttothenewviewcontroller.}*/@end


MyOperation.h

看继承关系---这个是继承与NSOperation

#import<Foundation/Foundation.h>@interfaceMyOperation:NSOperation@end


MyOperation.m

#import"MyOperation.h"@implementationMyOperation-(void)main{//自己定义的Operation的类,需要在mian方法中写要执行的任务内容NSLog(@"当前线程:%@",[NSThreadcurrentThread]);NSLog(@"是不是主线程尼:%d",[NSThreadisMainThread]);inta=0;for(inti=0;i<600000000;i++){a++;}NSLog(@"%d",a);}@end