IOS进程与线程学习笔记
来源:互联网 发布:默默西风淘宝店 编辑:程序博客网 时间:2024/06/05 03:07
首先,什么是进程?进程:一个正在运行的程序就是一个进程,进程拥有独立的运行所需的全部资源,而一个进程至少有一个线程.那么我又要提出什么是线程.线程就是一个独立运行的代码, 例如QQ中接受消息的代码,就可以成为一个线程.线程与线程之间相互无影响,每个线程只负责完成自己部分的功能.值得注意的是,一个进程可以由多个线程组成,进程只负责调动和分配,线程才是程序的真正执行单元.
每个正在运行的程序都至少包含一个线程,这个线程被称作主线程.主线程在程序启动是被创建, 用于执行main函数.如果只有一个主线程的程序,称作单线程程序.
多线程就是有多个线程的程序(这是句废话),而多线程是程序员自己编写的,根据需要开辟子线程,但不能无节制的开辟线程,会造成手机的卡顿.主线程与子线程都是独立的运行单元,各自运行没有影响,因此可以并发执行.
说完单线程与多线程的相关概念,接下来简述区别.如果一个程序中只有一个线程, 代码顺序执行,容易出现代码阻塞也就是页面假死.多线程程序线程间相互独立,不会造成阻塞现象,很好地提高了程序的运行性能.
下面说一下IOS多线程的实现:
在IOS中,可完成的函数有四个NSThread, NSOperation, NSObject, GCD
NSThread:
NSThread是一个轻量级多线程,有两种创建方法:
- (id)initWithTarget:(id)taget select:(SEL)selector object:(id)argument
+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument
用start函数开始执行子线程, 例如:
NSThread *thread = [ [NSThread alloc] initWithTarget:self select:@selector(show) object:nil];
[thread start];
值得注意的是, 在多线程方法中需要自己添加自动释放池来释放内存, 手动添加的子线程同样需要手动添加自动释放池.
NSOperation
NSOperation类, 在MVC中属于M, 是用来封装单个任务相关的代码和数据的抽象类, 所以不能直接使用.通常与NSOperationQueue结合使用.
那么提到NSOperationQueue,那么就说说它.
NSOperationQueue是操作队列, 他用来管理一组Operation对象的执行, 会根据需要自动为Operation开辟合适数量的线程,以完成任务的并行执行.下面介绍一下代码的写法
NSOperationQueue *queue = [ [NSOperationQueue alloc] init];
FirstOperation *myOperation = [ [FirstOperation alloc] init];//自定义operation
[queue addOperation:myOperation];
NSObject
NSObject也有一个简单地后台执行方法
- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg
GCD
GCD(Grand Central Dispatch)是苹果公司开发的技术.其核心就是具有一定功能的代码段.一般是一个block或者函数.GCD以队列的方式进行工作,先进先出原则,根据分发队列的类型, 创建合适数量的线程执行列队中得任务.
disqueue queue分为两种:SerialQueue 和 Concurrent
SerialQueue:一次只执行一个任务.Serial queue通常用于同步访问特定狗的资源或数据.当你创建多个Serialqueue时, 虽然它们各自是同步执行的,但Serialqueue与Serialqueue之间是并发执行的.
- IOS进程与线程学习笔记
- 进程与线程学习笔记
- 进程与线程学习笔记
- 进程与线程学习笔记
- 进程与线程学习笔记
- Java学习笔记3-进程与线程
- 03-java学习笔记【进程与线程】
- iOS线程与进程
- 进程与线程笔记
- 进程与线程学习
- IOS基础学习日志(六)线程与进程
- 【转】iOS 线程与进程
- iOS中的线程与进程
- Java并发学习笔记(1) 线程与进程
- C#学习笔记---进程与线程的一个简单解释
- 多线程 学习笔记<4> 进程与线程的区别联系
- Linux进程与线程学习笔记(更新)
- Android学习笔记之----浅析Android进程与线程
- 解决Android Sdk Manager更新很慢
- InputStream中read()与read(byte[] b)
- poj1376 Robot (bfs)
- JQuery中$.ajax()方法参数详解
- [Elasticsearch] 控制相关度 (一) - 相关度分值计算背后的理论
- IOS进程与线程学习笔记
- Maven内置属性
- 【好程序员特训营】Java线程同步初探
- timestamp、to_char在oracle使用过程中注意的问题
- 递归实现EasyUI中Tree的Json格式
- 数据库优化
- 系统性能优化
- 致青春——写给深不见底的悲伤
- 零学习opencl