iOS多线程与网络开发之多线程概述
Posted yutingliuyl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS多线程与网络开发之多线程概述相关的知识,希望对你有一定的参考价值。
郝萌主倾心贡献,尊重作者的劳动成果,请勿转载。
假设文章对您有所帮助,欢迎给作者捐赠。支持郝萌主,捐赠数额任意,重在心意^_^
我要捐赠: 点击捐赠
Cocos2d-X源代码下载:点我传送
游戏官方下载:http://dwz.cn/RwTjl
游戏视频预览:http://dwz.cn/RzHHd
游戏开发博客:http://dwz.cn/RzJzI
游戏源代码传送:http://dwz.cn/Nret1
A.进程
什么是进程
进程是指在系统中正在运行的一个应用程序
进程是指在系统中正在运行的一个应用程序
每一个进程之间是独立的。每一个进程均运行在其专用且受保护的内存空间内
比方同一时候打开QQ、Xcode,系统就会分别启动2个进程
通过“活动监视器”能够查看Mac系统中所开启的进程
B.线程
主线程、子线程占用内存各自是1M和512K
1.什么是线程
1个进程要想运行任务。必须得有线程(每1个进程至少要有1条线程)
1个进程要想运行任务。必须得有线程(每1个进程至少要有1条线程)
线程是进程的基本运行单元。一个进程(程序)的全部任务都在线程中运行
比方使用酷狗播放音乐、使用迅雷下载电影。都须要在线程中运行
2.线程的串行
1个线程中任务的运行是串行的
假设要在1个线程中运行多个任务。那么仅仅能一个一个地按顺序运行这些任务
假设要在1个线程中运行多个任务。那么仅仅能一个一个地按顺序运行这些任务
也就是说,在同一时间内,1个线程仅仅能运行1个任务
比方在1个线程中下载3个文件(各自是文件A、文件B、文件C)
3.多线程
什么是多线程
1个进程中能够开启多条线程。每条线程能够并行(同一时候)运行不同的任务
进程 车间,线程 车间工人
1个进程中能够开启多条线程。每条线程能够并行(同一时候)运行不同的任务
进程 车间,线程 车间工人
多线程技术能够提高程序的运行效率
比方同一时候开启3条线程分别下载3个文件(各自是文件A、文件B、文件C)
4.多线程原理
多线程的原理
同一时间,CPU仅仅能处理1条线程。仅仅有1条线程在工作(运行)
多线程并发(同一时候)运行,事实上是CPU高速地在多条线程之间调度(切换)
假设CPU调度线程的时间足够快,就造成了多线程并发运行的假象
思考:假设线程很许多,会发生什么情况?
CPU会在N多线程之间调度。CPU会累死,消耗大量的CPU资源
每条线程被调度运行的频次会减少(线程的运行效率减少)
同一时间,CPU仅仅能处理1条线程。仅仅有1条线程在工作(运行)
多线程并发(同一时候)运行,事实上是CPU高速地在多条线程之间调度(切换)
假设CPU调度线程的时间足够快,就造成了多线程并发运行的假象
思考:假设线程很许多,会发生什么情况?
CPU会在N多线程之间调度。CPU会累死,消耗大量的CPU资源
每条线程被调度运行的频次会减少(线程的运行效率减少)
5.多线程的优缺点
多线程的长处
能适当提高程序的运行效率
能适当提高资源利用率(CPU、内存利用率)
多线程的缺点
开启线程须要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB),假设开启大量的线程。会占用大量的内存空间,减少程序的性能
线程越多,CPU在调度线程上的开销就越大
程序设计更加复杂:比方线程之间的通信、多线程的数据共享
能适当提高程序的运行效率
能适当提高资源利用率(CPU、内存利用率)
多线程的缺点
开启线程须要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB),假设开启大量的线程。会占用大量的内存空间,减少程序的性能
线程越多,CPU在调度线程上的开销就越大
程序设计更加复杂:比方线程之间的通信、多线程的数据共享
6.主线程
什么是主线程
一个ios程序运行后。默认会开启1条线程。称为“主线程”或“UI线程”
主线程的主要作用
显示\\刷新UI界面
处理UI事件(比方点击事件、滚动事件、拖拽事件等)
主线程的使用注意
别将比較耗时的操作放到主线程中
一个ios程序运行后。默认会开启1条线程。称为“主线程”或“UI线程”
主线程的主要作用
显示\\刷新UI界面
处理UI事件(比方点击事件、滚动事件、拖拽事件等)
主线程的使用注意
别将比較耗时的操作放到主线程中
耗时操作会卡住主线程。严重影响UI的流畅度,给用户一种“卡”的坏体验
7.iOS多线程实现技术
- pthread
- NSThread
- GCD
- NSOperation
C.须要掌握的
多线程
1.NSThread
1> 开线程的几种方式
* 先创建,后启动
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[thread start];
* 直接启动
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
[self performSelectorInBackground:@selector(run) withObject:nil];
2> 其它使用方法
NSThread *current = [NSThread currentThread];
+ (NSThread *)mainThread; // 获得主线程
3> 线程间通信
performSelectorOnMainThread.....
2.GCD(重点)
1> 队列的类型
* 并发队列
获得全局的并发队列: dispatch_get_global_queue
* 串行队列
a.自己创建
dispatch_queue_create
b.主队列
dispatch_get_main_queue
2> 运行任务的方法类型
* 同步(sync)运行
* 异步(async)运行
3> 了解队列和方法的配合使用
4> 线程间通信
dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 运行耗时的异步操作...
dispatch_async(dispatch_get_main_queue(), ^{
// 回到主线程。运行UI刷新操作
});
});
5> 其它使用方法
dispatch_once
dispatch_after
dispatch_group_async\\dispatch_group_notify
3.NSOperation
1> 基本使用
NSInvocationOperation
NSBlockOperation
2> NSOperationQueue(重点)
* 最大并发数设置
1.NSThread
1> 开线程的几种方式
* 先创建,后启动
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[thread start];
* 直接启动
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
[self performSelectorInBackground:@selector(run) withObject:nil];
2> 其它使用方法
NSThread *current = [NSThread currentThread];
+ (NSThread *)mainThread; // 获得主线程
3> 线程间通信
performSelectorOnMainThread.....
2.GCD(重点)
1> 队列的类型
* 并发队列
获得全局的并发队列: dispatch_get_global_queue
* 串行队列
a.自己创建
dispatch_queue_create
b.主队列
dispatch_get_main_queue
2> 运行任务的方法类型
* 同步(sync)运行
* 异步(async)运行
3> 了解队列和方法的配合使用
4> 线程间通信
dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 运行耗时的异步操作...
dispatch_async(dispatch_get_main_queue(), ^{
// 回到主线程。运行UI刷新操作
});
});
5> 其它使用方法
dispatch_once
dispatch_after
dispatch_group_async\\dispatch_group_notify
3.NSOperation
1> 基本使用
NSInvocationOperation
NSBlockOperation
2> NSOperationQueue(重点)
* 最大并发数设置
- (void)setMaxConcurrentOperationCount:(NSInteger)cnt;
注意:此方法仅能限制同一时候运行的线程数。不能限制特定的线程(就可以能每次运行的线程组都是不一样的)
* 设置依赖
[operationB addDependency:operationA]; // 操作B依赖于操作A
3> 自己定义Operation(了解基本流程)
[operationB addDependency:operationA]; // 操作B依赖于操作A
3> 自己定义Operation(了解基本流程)
4> 怎样解决一张图片(一个url)反复下载的问题
郝萌主倾心贡献,尊重作者的劳动成果。请勿转载。
假设文章对您有所帮助。欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^
我要捐赠: 点击捐赠
Cocos2d-X源代码下载:点我传送
游戏官方下载:http://dwz.cn/RwTjl
游戏视频预览:http://dwz.cn/RzHHd
游戏开发博客:http://dwz.cn/RzJzI
游戏源代码传送:http://dwz.cn/Nret1
以上是关于iOS多线程与网络开发之多线程概述的主要内容,如果未能解决你的问题,请参考以下文章