1)并发和并行的区别
在软件开发中不可避免的会遇到多线程的问题,在iOS客户端开发(或者.NET的winform或者wpf这样的cs程序)中就更不可避免的会用到多线程,在bs类型的web项目中要考虑一个并发问题,而在这里我们来说一下多线程的并行问题。
首先了解并发和并行的区别:
并发的实质是一个物理CPU(也可以多个物理CPU) 在若干道程序之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率。但同一个时刻只能有一个用户使用资源,通过时间的间隔来实现一个逻辑上的并行效果。
并行性指两个或两个以上事件或活动在同一时刻发生。在多道程序环境下,并行性使多个程序同一时刻可在不同CPU上同时执行。是并行效果的物理实现。
并发,是在同一个cpu上同时(不是真正的同时,而是看来是同时,因为cpu要在多个程序间切换)运行多个程序。
并行,是每个cpu运行一个程序。
打个比方。并发,就像一个人(cpu)喂2个孩子(程序),轮换着每人喂一口,表面上两个孩子都在吃饭。并行,就是2个人喂2个孩子,两个孩子也同时在吃饭。
2)进程和线程的区别
进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示;进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程;通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立 运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的 程度。线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定。线程的运行中需要使用计算机的内存资源和CPU。一个进程中至少要有一个线程。
3)iOS中多线程的实现方式
1.Pthread
2.NSThread(手动开启一个子线程,是一个脱离线程,用完了会自动释放)
3.NSOperation(任务对象的抽象类一般用它的两个子类InvocatonOperationAction和BlockOperationAction,然后把它们丢到NSOperationQueue中执行,开启的线程是非脱离线程,用完了不会自动释放)
//单独使用的时候只是启动- (IBAction)InvocatonOperationAction:(id)sender { //此时并没有开启子线程 程序依然会卡死 NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(ciclyAction:) object:@"ddd"]; //手动执行 [invocationOperation start]; } - (IBAction)BlockOperationAction:(id)sender { //此时并没有开启子线程 程序依然会卡死 //创建NSBlockOperation对象 NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{ [self ciclyAction:nil]; }]; //手动启动 [blockOperation start]; } //放到NSOperationQueue中才有效果 - (IBAction)NSOperationQueueAction:(id)sender { //创建operation1 NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(done) object:nil]; //创建operation2 NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{ for (int i = 0; i < 100; i++) { NSLog(@"嘎嘎嘎嘎嘎嘎嘎*********我是operation2.。。。。。。。"); } }]; //创建NSOperationQueue对象 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //最大并发数 queue.maxConcurrentOperationCount = 1; //依赖关系(可以设置执行的先后顺序) [operation1 addDependency:operation2]; //添加Operation 对象(Operation 对象不需要手动start) [queue addOperation:operation1]; [queue addOperation:operation2]; }
4.NSObject
//NSObject也可以开启后台子线程 - (IBAction)NSObjectAction:(id)sender { [self performSelectorInBackground:@selector(ciclyAction:) withObject:@"ddd"]; //返回主线程的方法 // [self performSelectorOnMainThread:<#(SEL)#> withObject:<#(id)#> waitUntilDone:<#(BOOL)#>] }
5.GCD
注意:GCD是基于队列的,NSOperation是基于GCD的
另外脱离线程想要变为费脱离线程就要打开它的runloop机制。一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。如果我们需要一个机制,让线程能随时处理事件但并不退出.