iOS之多线程浅谈

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机制。一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。如果我们需要一个机制,让线程能随时处理事件但并不退出.

 

转载于:https://www.cnblogs.com/yk123/p/5366377.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值