线程与进程

iOS中哪些技术可以实现开辟线程,他们之间的联系和区别是什么?

创建方式:

NSThread、NSOperation、GCD

联系:

三种编程方式都是针对线程操作来讲的,从上到下,抽象层次是从低到高,抽象程度越到的使用越简单;

区别:

(1)NSThread:

优点:NSThread比其他两个轻量级,使用简单

缺点:需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。线程同步对数据的加锁会有一定的系统开销

(2)NSOpearation:

— 不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上

— NSOpearation是面向对象的,给予OC语言实现的API。两种默认实现:NSInvocationOperation和NSBlockOperation。

(3)GCD:

— Grand Central Dispatch是有苹果开发的一个多核编程的解决方案。iOS4.0+才能使用,是替代NStread,NSOperation的高效和强大的技术;

— GCD是基于C语言的API,提供了非常多强大的函数,GCD会自动管理线程的声明周期(创建线程、调度任务、销毁线程)。程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码。我们在编写GCD相关代码的时候,面对的函数,而不是方法。GCD中的函数大多数都以dispatch开头。



线程 和 进程


(1)进程:运行中的应用程序,操作系统称之为一个进程;编写->编译(.m->.o)->链接(把扇贝一部生成的.o文件连城引用程序);当用户启动应用程序,首先操作系统给启动的应用程序分配地址空间,然后把程序加载到代码段,操作系统再帮你生成一个主线程,用于执行代码(给它分配CPU)

(2)线程:是一个执行序列,是CPU分配的单位,如何分配靠操作系统的调度算法,线程必须存在于一个进程中,但是一个进程可以包含多个执行序列,也就是多个线程;


线程和进程的联系和区别

定义:

      进程是系统进行资源分配和调度的一个独立单位;线程是进程的实体,是cpu调度和分派的基本单位;

关系:

    一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。

区别:

    (1)简而言之,一个程序至少有一个进程,一个进程至少有一个线程   

    (2)线程的划分尺度小于进程,使得多线程程序的并发性高

    (3)进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大的提高了程序的运行效率

    (4)线程不能独立执行,必须依存于应用程序中,由应用程序提供多个线程执行控制

    (5)多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统不会将多线程看做多个应用,来实现进程的调度和管理及资源分配。





一、NSThread:

      创建一个线程,每一个线程都有一个入口函数,称之为线程函数,线程从线程函数开始执行,当一个线程的入口函数执行完毕,线程就会被操作系统回收;

隐式创建一条新的线程:

[self performSelectorInBackground:<#(nonnull SEL)#> withObject:<#(nullable id)#>];

线程间通讯(传值),不允许子线程中刷新UI

[self performSelectorOnMainThread:<#(nonnull SEL)#> withObject:<#(nullable id)#> waitUntilDone:<#(BOOL)#>];

实例方法创建一个子线程,需要手动开启

NSThread *thread = [NSThread alloc] initWithTarget:<#(nonnull id)#> selector:<#(nonnull SEL)#> object:<#(nullable id)#>];

thread.name = @"子线程";

//启动线程

[thread start];

类方法开启一条新的线程,不需要手动开启,会直接执行方法

[NSThread detachNewThreadSelector:<#(nonnull SEL)#> toTarget:<#(nonnull id)#> withObject:<#(nullable id)#>];

其中参数:

/**

*  detachNewThreadSelector 创建一个线程并自动执行

*  SEL:线程的入口函数

*  target:目标,在吗哥object的selector上作为线程的入口函数

*  withObject:可以传递一个参数作为线程的参数

*

*/

/**

*  操作系统给线程分配CPU的参考因素:

*  1、时间片

*  2、优先级

*  3、线程的饥渴状态

*  4、线程nice值等

*  注意:不是优先级高就一定优先执行,CPU的调度室操作系统自己决定的,但是只要有一个线程,CPU就会分配

*/


GCD:

GCD:是iOS提供的对多核并发支持的一种多线程技术之一,NSOperation就是使用GCD来实现,GCD是以C语言的方式提供的,需要我们一block的形式提供服务;

CGD:默认是我们踢狗3中队列供我们使用,分别是主队列、全局并行队列、串行队列,我们只需要把我们的任务一block的形式提交到队列上

任务 && 队列

任务:同步(不开线程)和异步(开线程)

同步任务

dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)

异步任务

dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)

队列:串行(一个一个执行)和并行(一起执行)

1、主队列:主线程队列,在该队列中放置所有任务都在主线程执行,

2、全局并行队列:在队列上提交每个人物,都是生成一个线程,并行的执行,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);

3、串行队列:在该队列上提交的任务,生成一个线程,在该线程上顺序执行,一个执行完成后下一个才能执行,

dispatch_queue_create(<#const char *label#>, <#dispatch_queue_attr_t attr#>)

主队列,不允许在主线程中提交同步任务,否则会死循环;dispatch_queue_t mainQueue = dispatch_get_main_queue();

同步:会卡死

异步:不会开线程,顺序执行

全局并发队列

dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT , 0);

同步:不会开线程,顺序执行;

异步:会开线程,并且乱序执行

自定义串行队列

dispatch_queue_t SerialQueue = dispatch_queue_create("qf", NULL);

同步:不会开线程,顺序执行

异步:会开线程,顺序执行

自定义并行队列

dispatch_queue_t ConcurrentQueue = dispatch_queue_create("qf", DISPATCH_QUEUE_CONCURRENT);

同步:不会开线程,顺序执行

异步:会开线程,乱序执行

从子线程切换到主线程的方法

1、self performSelectorOnMainThread:<#(nonnull SEL)#> withObject:<#(nullable id)#>

waitUntilDone:<#(BOOL)#>

2、[NSOperationQueue mainQueue] addOperation:<#(nonnull NSOperation *)#>

3、dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)


NSOperation:

      iOS给我们提供的线程池,我们只需要把我们的操作(NSOperation的子类)放到队列上,操作系统自动生成线程来执行该操作;

      使用方法:首先创建线程池,也就是生成NSOperationQueue对象,然后把NSOperationQueue对象放到队列中;

       NSOperation 底层基于GCD来实现的,

       NSOperating 是一个抽象类,无法直接使用,它只是定义了一些方法,并没用实现,我们需要使用它的子类,在子类中去实现对应的方法

系统定义的NSOperating的子类

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容