iOS开发多线程-多线程技术1
一、基本概念
1.什么是进程
进程就是指在系统中正在运行的一个应用程序
每个应用之间是相互独立的
每个进程都运行在其专有的并且受保护的内存空间内。
2.什么是线程
一个进程想要执行程序,就必须需要一个线程,
线程是程序执行的基本单元,应用的所有的任务都在线程中执行的。
当程序启动之后,系统会自动为进程创建一条线程,称之为 “主线程” “UI线程”
3.线程的串行
一个线程执行任务是串行的,也就是说,在一个线程内,执行任务是从顺序执行的
同一时间,线程只能执行一个任务----> CPU在同一时间也只能执行一个线程
二、多线程
1.什么是多线程
多线程指的是,在同一个进程中,创建多个线程,每个线程"并发(同时)“执行各自的任务。
可以有效的提高系统的效率
如下,当CPU快速的切换三条线程,就可以产生并发效果
2.多线程的原理
同一时间,CPU只能执行一个线程,只能又一个线程在执行;
当多线程并发的时候,CPU在多个线程之间快速的调度(切换),就能产生并发(同时)执行的现象。
注意: 并发执行,是一种假象,看起来是同时执行的。
并行只是,是真正的同时执行。
3.多线程的优缺点
优点:
能够提高程序的执行效率
能适当的提高系统资源的利用率
缺点
开启线程是需要一定的内存空间的(默认:主线程 1M 子线程 512B),如果开启太多线程,会占用过多的内存空间;
线程越多,CPU在线程调度上的消耗增多;
线程越多,相同时间内,每个线程调度是次数就越少;
程序设计更加复杂,例如:线程之间的通信、线程之间的数据共享等问题;
注意:系统创建的线程称为"主线程",其他的线程称为"子线程"。
三、多线程的应用
1.主线程
主线程:当进程开启的时候,系统默认会开启 一条线程,称为:"主线程" 或"UI线程";
作用:
显示/刷新UI界面
处理UI界面(例如 点击、滚动、拖拽等)
2.主线程的注意事项
为了更加良好的用户体验,不要讲耗时较长的任务放在主线程中,否则会影响UI的流畅度,造成卡顿的现象
例如:
如果耗时较长(10s),那么主线程是会一直停留在该任务中,直到任务完成,当第5s点击时候,无法立即响应用户的点击事件
将耗时较长的任务放在子线程之后,能够立即相应用户的点击事件
四、IOS多线程的实现方案
五、pthread 和NSThread的简单介绍
1.pthread的简单介绍
创建的函数:
int pthread_create(pthread_t * __restrict, const pthread_attr_t * __restrict,void *(*)(void *), void * __restrict);
pthread_t *restrict:线程标识符的地址
const pthread_attr_t *restrict:设置线程的属性
void *(*)(void *):线程中执行的函数.
void *restrict:传递给执行函数的参数. 可以传一个任意类型的参数
C语言中de void * 等同于 OC中的 id
返回值: 返回 0 代表线程创建成功
返回其他数值,代表线程创建失败,.返回的数值,是失败的状态
注意:
在ARC的环境下面,C语言和OC不能直接传递
__bridge 桥接:C语言没有自动内存管理,需要对C语言代码进行添加自动内存操作,只有在ARC环境下才需要
OC:在 ARC环境下,不需要手动添加自动内存管理(retain/release/autorelease/)
添加的目的,就是告诉编译器,为OC代码添加自动内存管理代码
对该文件编译环境设置:
非ARC机制 -fno-objc-arc
ARC : -fobjc-arc
代码:
#import "ViewController.h" #import <pthread.h> @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; } - (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { // 创建一个线程标识符 pthread_t myThread; NSString* str = @"pthread"; int result = pthread_create(&myThread, NULL, longTimeOperation, str); NSLog(@"%d",result); } void*(longTimeOperation)(void* data) { NSLog(@"----%@------%@", data, [NSThread currentThread]); return NULL; } @end
2.NSThread的介绍
1> 线程的创建和启动
一个NSThread就代表这一个对象
创建启动
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[thread start];
线程一启动,就是告诉CPU已经"就绪",当CPU调度该线程的时候,就会执行相应的方法。
创建线程后自动启动线程
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
隐式创建并启动线程
[self performSelectorInBackground:@selector(run) withObject:nil];
提示: 后两种创建的方式,无法获得该线程对象,就不能对其进行更加详细的设置
2>常用的方法
主线程相关的:
+ (NSThread *)mainThread; // 获得主线程
- (BOOL)isMainThread; // 是否为主线程
+ (BOOL)isMainThread; // 是否为主线程
获得当前线程:
NSThread *current = [NSThread currentThread];
线程的调度优先级
+ (double)threadPriority;
+ (BOOL)setThreadPriority:(double)p;
- (double)threadPriority;
- (BOOL)setThreadPriority:(double)p;
调度优先级的取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高
线程的名字
- (void)setName:(NSString *)n;
- (NSString *)name;
六、线程的状态
1、线程的状态
线程一共有四种状态:就绪、运行、阻塞、死亡。
注意:当线程进入阻塞状态后,会从可调度线程池里面移除
2、线程状态的相关方法
启动线程(进入就绪状态)
- (void)start;
阻塞(暂停)线程(进入阻塞状态)
+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;
强制停止线程(进入死亡状态)
+ (void)exit;
七、线程锁
1、引入:线程安全问题(多个线程访问同一块数据)
。。。。。未完待续
iOS开发多线程-多线程技术1的更多相关文章
- iOS开发之多线程技术
本篇争取一篇讲清讲透,依然将通过四大方面清晰的对iOS开发中多线程的用法进行详尽的讲解: 一.什么是多线程 1)多线程执行原理 2)线程与进程 3)多线程的优缺点 二.我们为什么要用多线程编程技术 三 ...
- iOS开发-多线程编程技术(Thread、Cocoa operations、GCD)
简介 在软件开发中,多线程编程技术被广泛应用,相信多线程任务对我们来说已经不再陌生了.有了多线程技术,我们可以同做多个事情,而不是一个一个任务地进行.比如:前端和后台作交互.大任务(需要耗费一定的时间 ...
- iOS开发-多线程开发之线程安全篇
前言:一块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源,比如多个线程访问同一个对象.同一个变量.同一个文件和同一个方法等.因此当多个线程访问同一块资源时,很容易会发生数据错误及数据不安 ...
- ios开发之多线程---GCD
一:基本概念 1:进程:正在运行的程序为进程. 2:线程:每个进程要想执行任务必须得有线程,进程中任务的执行都是在线程中. 3:线程的串行:一条线程里任务的执行都是串行的,假如有一个进程开辟了一条线程 ...
- iOS开发之多线程(NSThread、NSOperation、GCD)
整理一些多线程相关的知识. 并行 & 并发 1.并行:并行是相对于多核而言的,几个任务同时执行.2.并发:并发是相对于单核而言的,几个任务之间快速切换运行,看起来像是"同时" ...
- iOS开发之多线程技术(NSThread、OperationQueue、GCD)
在前面的博客中如果用到了异步请求的话,也是用到的第三方的东西,没有正儿八经的用过iOS中多线程的东西.其实多线程的东西还是蛮重要的,如果对于之前学过操作系统的小伙伴来说,理解多线程的东西还是比较容易的 ...
- iOS开发之多线程技术——NSOperation篇
本篇将从四个方面对iOS开发中使用到的NSOperation技术进行讲解: 一.什么是NSOperation 二.我们为什么使用NSOperation 三.在实际开发中如何使用NSOperation ...
- iOS开发之多线程技术——GCD篇
本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & ...
- iOS开发之多线程技术—GCD篇
本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & ...
- iOS开发中多线程基础
耗时操作演练 代码演练 编写耗时方法 - (void)longOperation { for (int i = 0; i < 10000; ++i) { NSLog(@"%@ %d&q ...
随机推荐
- 做10年Windows程序员与做10年Linux程序员的区别(附无数评论)(开源软件相当于熟读唐诗三百首,不会作诗也会吟)
如果一个程序员从来没有在linux,unix下开发过程序,一直在windows下面开发程序, 同样是工作10年, 大部分情况下与在linux,unix下面开发10年的程序员水平会差别很大.我写这篇文章 ...
- yii基础知识-
控制器 是 CController 或其子类的实例.它在当用户请求时由应用创建. 当一个控制器运行时,它执行所请求的动作,动作通常会引入所必要的模型并渲染相应的视图. 动作 的最简形式,就是一个名字以 ...
- UVA10817--状态压缩DP
第一次做状态压缩dp..没有思路..看书看明白的,不过看完发现汝哥的做法多算了一些东西,完全可以省去不算.. 用两个集合,s1表示恰好有一个人教的科目,s2表示至少有两个人教的科目.d(i,s1,s2 ...
- OS快速开发必备
github:https://github.com/koknine (终于改成以前的了) 当前移动互联网行业太火爆,移动端的需求日益增长,很多开发人员每天都应对着各种需求,作为一名iOS开发人员,对于 ...
- 图的遍历(DFS、BFS)
理论: 深度优先搜索(Depth_Fisrst Search)遍历类似于树的先根遍历,是树的先根遍历的推广: 广度优先搜索(Breadth_First Search) 遍历类似于树的按层次遍历的过程: ...
- Android设备的ID
Android的开发者在一些特定情况下都需要知道手机中的唯一设备ID.例如,跟踪应用程序的安装,生成用于复制保护的DRM时需要使用设备的唯一ID.在本文档结尾处提供了作为参考的示例代码片段. 范围 本 ...
- 解决一个maven在eclipse中M2_HOME不能调整的问题
在坚持了许久之后,依然还是没能抵住maven的各种攻击,终于从0开始maven. 开始由于有关小项目,时间紧任务重,没仔细研究maven,便匆匆上手了,导致maven库的位置放在了c盘当前用户的数据目 ...
- 男同胞爱小秘籍--作为爱他的女朋友了几天C规划
各位男同胞,不知道你的女朋友没有在过去的一问天,你这个问题~~ 场景重现: 女友:"今天天气不错." 你们:"对" 女友:"今天是我们知道它的最初几天 ...
- Sprite Kit编程指南(1)-深入Sprite Kit
深入Sprite Kit 学习Sprite Kit最好的方法是在实践中观察它.此示例创建一对场景和各自的动画内容.通过这个例子,你将学习使用Sprite Kit内容的一些基础技术,包括: · ...
- HTML5-常见的事件- beforeunload事件
当我们在日常访问某些网站时,关闭当前网页时出现如下提示: beforeunload 事件就可以完成这样的事情,该事件发生时机:页面卸载之前,可以通过它来取消卸载并继续使用原有页面. 为了显示上面弹出对 ...