多线程GCD和Cocoa NSOperation实现原理
来源:互联网 发布:手机验钞软件 编辑:程序博客网 时间:2024/05/17 09:21
简介
多线程是一个比较轻量级的方法来实现单个应用程序内多个代码执行路径。
在系统级别内,程序并排执行,程序分配到每个程序的执行时间是基于该程序的所需时间和其他程序的所需时间来决定的。
然而,在每个程序内部,存在一个或者多个执行线程,它同时或在一个几乎同时发生的方式里执行不同的任务。
概要提示:
iPhone中的线程应用并不是无节制的,官方给出的资料显示,iPhoneOS下的主线程的堆栈大小是1M,第二个线程开始就是512KB,并且该值不能通过编译器开关或线程API函数来更改,只有主线程有直接修改UI的能力
一、线程概述
有些程序是一条直线,起点到终点——如简单的helloworld,运行打印完,它的生命周期便结束了,像是昙花一现。
有些程序是一个圆,不断循环直到将它切断——如操作系统,一直运行直到你关机。
一个运行着的程序就是一个进程或者叫做一个任务,一个进程至少包含一个线程,线程就是程序的执行流。
Mac和IOS中的程序启动,创建好一个进程的同时,一个线程便开始运作,这个线程叫做主线程。主线成在程序中的位置和其他线程不同,它是其他线程最终的父线程,且所有的界面的显示操作即AppKit或UIKit的操作必须在主线程进行。
系统中每一个进程都有自己独立的虚拟内存空间,而同一个进程中的多个线程则公用进程的内存空间。
每创建一个新的进成,都需要一些内存(如每个线程有自己的stack空间)和消耗一定的CPU时间。
当多个进成对同一个资源出现争夺的时候需要注意线程安全问题
iOS有三种多线程编程的技术,分别是:
(一)NSThread
(二)Cocoa
(三)GCD(全称:Grand
三种方式的优缺点介绍:
1)NSThread
优点:NSThread 比其他两个轻量级
缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销
2)Cocoa
优点:不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上。
Cocoa operation相关的类是NSOperation, NSOperationQueue.
NSOperation是个抽象类,使用它必须用它的子类,可以实现它或者使用它定义好的两个子类:NSInvocationOperation和NSBlockOperation.
创建NSOperation子类的对象,把对象添加到NSOperationQueue队列里执行。
3) GCD(全优点)
Grand Centraldispatch(GCD)是Apple开发的一个多核编程的解决方案。在iOS4.0开始之后才能使用。GCD是一个替代NSThread,NSOperationQueue,NSInvocationOperation等技术的很高效强大的技术。
下面我用简单易于理解的代码实例来介绍NSThread在开发实践中的使用,具体使用时可以根据实际情况进行扩展:
一、NSThread的使用(基本已过时)
#define
@interface
@end
@interface
{
@end
@implementation
-
{
28
29}
1-
2 {
3
4
5
6
7
8 }
1-
2 {
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30}
1-
2 {
3
4
5
6
7
8
9
10
11}
第二种方式继承NSOperation
在.m文件中实现main方法,main方法编写要执行的代码即可。
如何控制线程池中的线程数?
队列里可以加入很多个NSOperation,可以把NSOperationQueue看作一个线程池,可往线程池中添加操作(NSOperation)到队列中。线程池中的线程可看作消费者,从队列中取走操作,并执行它。
通过下面的代码设置:
1[queue
线程池中的线程数,也就是并发操作数。默认情况下是-1,-1表示没有限制,这样会同时运行队列中的全部的操作。
[html] viewplaincopy
1-
2 {
3
4
5
6
7
8
9
10
11
12
13
14
15
16}
(三)GCD的介绍和使用
介绍:
Grand Central Dispatch简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统。这建立在任务并行执行的线程池模式的基础上的。它首次发布在MacOS X 10.6 ,iOS 4及以上也可用。
设计:
GCD的工作原理是:让程序平行排队的特定任务,根据可用的处理资源,安排他们在任何可用的处理器核心上执行任务。
一个任务可以是一个函数(function)或者是一个block。GCD的底层依然是用线程实现,不过这样可以让程序员不用关注实现的细节。
GCD中的FIFO队列称为dispatch queue,它可以保证先进来的任务先得到执行。
dispatch queue分为下面三种:
Serial
又称为private dispatch queues,同时只执行一个任务。Serialqueue通常用于同步访问特定的资源或数据。当你创建多个Serial queue时,虽然它们各自是同步执行的,但Serialqueue与Serial queue之间是并发执行的。
Concurrent
又称为global dispatch queue,可以并发地执行多个任务,但是执行完成的顺序是随机的。
Main dispatchqueue
它是全局可用的serial queue,它是在应用程序主线程上执行任务的。
我们看看dispatch queue如何使用?
1、常用的方法dispatch_async
为了避免界面在处理耗时的操作时卡死,比如读取网络数据,IO,数据库读写等,我们会在另外一个线程中处理这些操作,然后通知主线程更新界面。
用GCD实现这个流程的操作比前面介绍的NSThread
[html] viewplaincopy
1-
2 {
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32}
[html] viewplaincopy
1-
2 {
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26}
[html] viewplaincopy
1-
2 {
3
4
5
6
7
8
9
10
11}
12
13-
14{
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29}
30
31
34-
35
36
37
38
39
40
41
42}
43
44-
45{
46
47}
48
49@end
是不是代码比NSThread
系统给每一个应用程序提供了三个concurrent dispatchqueues。这三个并发调度队列是全局的,它们只有优先级的不同。因为是全局的,我们不需要去创建。我们只需要通过使用函数dispath_get_global_queue去得到队列。
以上代码组织的不是很好,只简单描述了一下多线程的基本概念,后续我再添加详细应用的实例,现只做为参考,在具体实际应用中还得我们自己来进行编写发挥。希望对大家有所帮助和启发。
- 多线程GCD和Cocoa NSOperation实现原理
- 多线程之NSThread、Cocoa NSOperation、GCD
- ios 多线程 NSThread Cocoa NSOperation GCD
- iOS多线程学习-NSThread、Cocoa NSOperation、GCD
- 多线程 GCD和NSOperation
- 多线程、特别是NSOperation 和 GCD 的内部原理
- 多线程、特别是NSOperation 和 GCD 的内部原理
- 多线程、特别是NSOperation 和 GCD 的内部原理
- 多线程、特别是NSOperation 和 GCD 的内部原理
- NSThread、Cocoa NSOperation、GCD
- [多线程]NSThread, NSOperation 和 GCD
- NSOperation和GCD的原理
- iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD
- iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD
- iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD
- iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD
- iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD
- iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD
- JAVA ArrayList利用Comparator实现自定义排序
- 不算重零开始的java学习(四)
- 设计模式学习之路-原型模式
- 解析mysqldump的过程和文件
- MaxSubSumArray
- 多线程GCD和Cocoa NSOperation实现原理
- 缓存算法
- matlab目录选择对话框 uigetdir
- 正则表达式详解
- 【规则引擎连载6】 WebSphere ILOG JRules 开发——部署规则项目到RES上
- 对于特征离散化,特征交叉,连续特征离散化非常经典的解释
- oracle表字段的增加删除和修改
- Yarn 2.8.x 基于标签的调度
- 高性能流媒体服务器-nebula之数据结构(7)--环形无锁队列