iOS之多线程浅谈

摘要:
在iOS客户端开发(或.NET winform或wpf等cs程序)中,使用多线程是不可避免的。在bs类型的web项目中,应该考虑并发问题。并行性使得多个程序可以同时在不同的CPU上执行。因为CPU需要在多个程序之间切换)运行多个程序。2) 进程和线程之间的区别进程是一个程序的运行活动,它具有关于数据集的独立功能。每个线程都有自己的执行堆栈和程序计数器作为其执行上下文。

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

免责声明:文章转载自《iOS之多线程浅谈》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【蓝桥杯训练】第二天1255、1258深入理解javascript原型和闭包(5)——instanceof下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

虚IP解决程序连只读服务器故障漂移

        目前公司有一套核心交易数据库配置了AlWaysON,SQL 2012版本, 1主4从, 其从库(8,14, 8.15) 这2台只读的从数据库服务器, 后台程序和wms等很多程序,都是直接配置IP连接这个2个机器,而且这2台机器已经过保,如果其中一天机器出现故障,不能使用,怎么处理?         怎么解决?         先谈谈后果:...

10 : mysql 主从复制

延时从库 主从复制很好的解决了物理损坏,但是如果主库有个误删除写入的操作怎么办? 正常情况下从库也会同步这个错误的,企业中应该怎么避免这个情况?这个时候就需要使用延时同步来解决: 延时从库?delay(延时)从节点同步数据。 对SQL线程进行延时设置。IO线程正常的执行。企业中一般延迟3-6小时 延时从库的配置过程:mysql>stop slave;...

(转)C#中 特性(attribute)的用法

定义 正如MSDN中所描述的那样----- “特性是被指定给某一声明的一则附加的声明性信息。” 使用预定义(Pre-defined)特性 在C#中,有一个小的预定义特性集合。在学习如何建立我们自己的定制特性(custom attributes)之前,我们先来看看在我们的代码中如何使用预定义特性。 using System;public class AnyC...

WebView2简单试用(四)—— 使用固定版本的Edge Runtime

Edge Runtime支持两种模式:长绿(All Green)和固定版本(Fixed Version)这两种方式和vc runtime安装比较类似。 长绿版本可以作为独立的安装包安装,所有程序共享。固定版本则也可以直接在程序中包含。 长绿版本的优势: 可以自动更新 支持在线和离线安装 所有WebView2程序共享运行时,节约磁盘空间     固定版本...

国内外免费PHP开源建站程序

互联网上有很多开源建站程序供站长选择,做社区时你在Discuz和PHPWind之间做比较,做资讯网时你在DedeCMS、PHPCMS和Wordpress之间比较,虽然如此,你依然不知道选择什么程序好,折腾好几个来回。 但还好你有得选,最头痛的是想做一个网站但找不到合适的程序,这里将28套程序分为[论坛社区]、[CMS内容管理]、[企业建站]、[网上商店]...

c#实现多线程代码例子

相信大家都有用过网际快车等下载资源的经历,它里面是可以设置线程数的(近年版本默认是10,曾经默认是5)。它会将文件分成与线程数相同的部分,然后每个线程下载自己的那一部分,这样下载效率就有可能提高。相信大家都有加多线程数,提升下载效率的经历。但细心的用户会发现,在带宽一定的情况下,并不是线程越多,速度越快,而是在某一点达到峰值。在C#中用多线程并不难实现。它...