IOS 多线程
来源:互联网 发布:js display 显示 编辑:程序博客网 时间:2024/06/14 10:33
程序;由源代码生成的可执行应用。
进程:一个正在运行的程序可以看做一个进程,进程拥有独立运行所需要的全部资源。
线程;程序中独立运行的代码段。
一个线程是由一个或多个线程组成。进程只负责资源的调度和分配,线程才是程序真正的执行单元,负责代码的执行。
//单线程
每个正在运行的程序,至少包含一个线程,这个线程叫做主线程。
主线程在程序启动的时候被创建,用于执行main函数。
只有一个主线程的程序,称作单线程程序。
主线程负责执行程序的所有代码,这些代码只能顺序执行,无法并行执行。
//多线程
拥有多个线程的程序,称作多线程程序。
IOS允许用户自己开辟新的线程,相对于主线程来讲,这个叫做子线程。
可以根据需要开辟若干个子线程
子线程和主线程都是独立的运行单元,各自的执行互不影响,因此能够并发执行。
//单。多线程的区别
单线程程序:只有一个线程,代码顺序执行,容易出现代码阻塞(页面假死)
多线程程序:有多个线程,线程间独立运行,能有效的避免代码堵塞,并能提高程序的运行性能。
注:IOS中关于UI的添加和刷新必须在主线程中操作。
线程阻塞:网络解析,图片加载,数据存储,数据库操作,复杂逻辑
ios多线程实现种类:
NSThread,是一种轻量级的多线程,创建方法如下
进程:一个正在运行的程序可以看做一个进程,进程拥有独立运行所需要的全部资源。
线程;程序中独立运行的代码段。
一个线程是由一个或多个线程组成。进程只负责资源的调度和分配,线程才是程序真正的执行单元,负责代码的执行。
//单线程
每个正在运行的程序,至少包含一个线程,这个线程叫做主线程。
主线程在程序启动的时候被创建,用于执行main函数。
只有一个主线程的程序,称作单线程程序。
主线程负责执行程序的所有代码,这些代码只能顺序执行,无法并行执行。
//多线程
拥有多个线程的程序,称作多线程程序。
IOS允许用户自己开辟新的线程,相对于主线程来讲,这个叫做子线程。
可以根据需要开辟若干个子线程
子线程和主线程都是独立的运行单元,各自的执行互不影响,因此能够并发执行。
//单。多线程的区别
单线程程序:只有一个线程,代码顺序执行,容易出现代码阻塞(页面假死)
多线程程序:有多个线程,线程间独立运行,能有效的避免代码堵塞,并能提高程序的运行性能。
注:IOS中关于UI的添加和刷新必须在主线程中操作。
线程阻塞:网络解析,图片加载,数据存储,数据库操作,复杂逻辑
ios多线程实现种类:
NSThread,是一种轻量级的多线程,创建方法如下
创建初始化initWithTarget:执行者 selector:选择器 object:参数对象
//通过init方法创建的NSThread对象,需要手动开启start
NSThread *thread1 = [[NSThread alloc]initWithTarget:self selector:@selector(printNumber) object:nil]; [thread1 start]; [thread1 cancel];
[NSThread detachNewThreadSelector:@selector(printNumber) toTarget:self withObject:nil];
在多线程方法中需要添加自动释放池。
在应用打开的时候,会自动为主线程创建一个自动释放池。
我们手动创建的子线程需要我没手动添加自动释放池。
NSOperation类,在MVC中属于M,是用于封装单个任务相关的代码和数据的类。因为它是抽象的,不能够直接使用这个类,而是使用子类(NSinvaocationOperation或 NSBlockOperation)来执行实际任务。其本身只是一个操作,本身无主线程、子线程之分,可以任意使用。通常与NSOperationQueue结合使用。
NSOperationQueue,线程队列。用来管理一组Operation对的执行,会根据需求自动开辟合适数量的线程,一完成任务。
NSOperation可以调节它在队列中的优先级
当最大并发数设置为1时,能够实现线程同步。
//1.NSInvocatonOpreation操作 NSInvocationOperation *iOp = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(printNumber) object:nil]; //Opreation不能自己执行,需要通过队列进行调用 [[NSOperationQueue mainQueue] addOperation:iOp]; */
//2.NSBlockOperation NSBlockOperation *bOp = [[NSBlockOperation alloc]init]; ///以代码块的方式添加操作 [bOp addExecutionBlock:^{ for (int i = 0; i < 100; i++) { NSLog(@"%d 当前线程%@",i,[NSThread currentThread]); } }]; //添加到线程队列 //[[NSOperationQueue mainQueue] addOperation:bOp];//主线程 [self.operationQueue addOperation:bOp]; //添加到子线程队列
//主队列 主线程 NSLog(@"主队列%@",[NSOperationQueue mainQueue]); NSLog(@"主线程%@",[NSThread mainThread]); //NSBlockOperation 创建方式 可以便利构造,直接添加block /* NSBlockOperation *bOp = [NSBlockOperation blockOperationWithBlock:^{ for (int i = 1; i < 100; i++) { NSLog(@"%d%@",i,[NSThread currentThread]); } }]; NSBlockOperation *bOp1 = [NSBlockOperation blockOperationWithBlock:^{ for (int i = 1; i < 100; i++) { NSLog(@"%d%@",i,[NSThread currentThread]); } }]; NSBlockOperation *bOp2 = [NSBlockOperation blockOperationWithBlock:^{ for (int i = 1; i < 100; i++) { NSLog(@"%d%@",i,[NSThread currentThread]); } }]; //添加到主队列 //[[NSOperationQueue mainQueue] addOperation:bOp]; //自定义队列 self.operationQueue = [[NSOperationQueue alloc]init]; //设置最大并发数 self.operationQueue.maxConcurrentOperationCount = 4; //[self.operationQueue addOperation:bOp1]; //[self.operationQueue addOperation:bOp2]; */
NSObject,中存在一个最简单的后台执行的方法
//NSObject 简单后台方法 [self performSelectorInBackground:@selector(printNumber:) withObject:nil];GCD :中央派发机制 Grand Center Dispatch 基于函数 使用分队队列
//1.主线程队列 等同[NSOpreationQueue mainQueue] //2.全局线程队列 后台队列,并行 //3.自定义线程队列 DISPATCH_QUEUE-SERIAL 串行 DISPATCH_QUEUE_CONCURRENT 并行 //创建自定义队列 DISPATCH_QUEUE_PRIORITY_DEFAULT 优先级 //任务:具有一定功能的代码段。一般式一个block或者函数 dispatch_queue_t maQueue = dispatch_queue_create("com.lanou3g.www.myQueue", DISPATCH_QUEUE_PRIORITY_DEFAULT); //队列优先级 串行/并行 // dispatch_async (队列,执行block) // dispatch_sync (队列, 执行block) /* dispatch_async(maQueue, ^{ [self printNumber:@"GCD"]; [self printNumber:@"C1"]; }); //添加操作 dispatch_async(maQueue, ^{ [self printNumber:@"G2"]; }); */ //并行队列 /* dispatch_queue_t conQueue = dispatch_queue_create("com.lanou3g.www.conQueue", DISPATCH_QUEUE_CONCURRENT); dispatch_async(conQueue, ^{ [self printNumber:@"G1"]; [self printNumber:@"G2"]; }); dispatch_async(conQueue, ^{ [self printNumber:@"G3"]; }); dispatch_async(conQueue, ^{ [self printNumber:@"G4"]; });
//声明一个打印方法-(void)printNumber:(NSString *)name{ for (int i = 0; i < 100; i++) { NSLog(@"%d%@",i,[NSThread currentThread]); NSLog(@"%@",name); }}//设置最大并发数- (IBAction)didClickMaxConButton:(id)sender { //线程队列的最大并发数 NSInvocationOperation *iOp1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(printNumber:) object:@"iop1"]; NSInvocationOperation *iOp2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(printNumber:) object:@"iop2"]; NSInvocationOperation *iOp3 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(printNumber:) object:@"iop3"]; NSInvocationOperation *iOp4 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(printNumber:) object:nil]; NSInvocationOperation *iOp5 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(printNumber:) object:nil]; //添加到线程队列 [self.operationQueue addOperations:@[iOp1,iOp2,iOp3,iOp4,iOp5] waitUntilFinished:YES]; }//设置依赖- (IBAction)didClickDependyButton:(id)sender { NSInvocationOperation *iOp1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(printNumber:) object:@"iop1"]; NSInvocationOperation *iOp2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(printNumber:) object:@"iop2"]; NSInvocationOperation *iOp3 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(printNumber:) object:@"iop3"]; [iOp1 addDependency:iOp2]; [iOp2 addDependency:iOp3]; [self.operationQueue addOperations:@[iOp1,iOp2,iOp3] waitUntilFinished:YES];}//在延迟的时间点- (IBAction)didClickAfterButton:(id)sender { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ NSLog(@"等我5秒"); });}//重复执行- (IBAction)didClickApplyButton:(id)sender { dispatch_apply(10, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t t) { NSLog(@"重复十次 %zu次",t); });}//当一个分组执行结束,notify之中的才会执行- (IBAction)didClickNotifyButton:(id)sender { //创建分组标签 dispatch_group_t groupA = dispatch_group_create(); //使用分组 //创建队列 dispatch_queue_t myQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT); //将操作添加到队列,添加分组标签 dispatch_group_async(groupA, myQueue, ^{ [self printNumber:@"groupA"]; }); dispatch_group_async(groupA, myQueue, ^{ [self printNumber:@"groupAA"]; }); //notify dispatch_group_notify(groupA, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSLog(@"groupA的都执行完以后,我才能执行"); });}
0 0
- ios多线程
- iOS多线程
- iOS多线程
- iOS多线程
- 多线程ios
- IOS 多线程
- ios多线程
- ios 多线程
- IOS多线程
- IOS多线程
- iOS多线程
- iOS多线程
- ios 多线程
- iOS多线程
- IOS多线程
- ios多线程
- iOS 多线程
- iOS 多线程
- 黑马程序员 Java基础——多态、抽象类及接口
- Quick Sort源码
- 数学三角形问题
- Debugging Error: ClassNotFoundException的解决办法
- lintcode-落单的数III-84
- IOS 多线程
- iOS 加载大量高清图片, 内存警告导致crash
- template模板
- oracle课堂收录-过程中的事务处理
- Nginx conf/nginx.conf配置
- 如何修改Linux系统的默认启动级别
- Spring之注解
- qschedule
- java的