Objective-c——多线程开发第一天(pthread/NSThread)
一、为什么要使用多线程?
1、循环模拟耗时任务
1、同步执行
2、异步执行
(香烟编程小秘书)
3、进程
系统中正在运行的一个应用程序
每个进程之间是独立的, 均运行在其专用的且受保护的内存空间
通过活动监视器,可以查看mac系统中的开启进程
(外挂修改游戏进程中的数据,外挂用c汇编等底层)
4、线程
1个进程由一个或多个线程组成
是进程的基本执行单元(至少一个线程)
多线程:
1个进程可开启多个线程,多个线程可以“同时”执行不同任务
进程-公司,线程- 员工:老板:主线程
多线程可以提高程序的执行效率
1、安卓相隔一个虚拟机
2、每一个晶体管中的核很小,逻辑没有苹果单核性能高
3、苹果的cpu号称可以击败台式机的cpu
单核执行原理:
4个线程,线程1执行完紧接线程2?
假设成立:线程1死循环还能跑?所以假设不成立
多线程:不等待线程1执行完毕再执行线程2
之所以说多线程同时进行,其实是切换进行,只是时间很快近乎同时
多线程的优点:
1、能适当提高程序的执行效率
2、能够适当的提高资源的利用率
多线程的缺点:(成本:时间成本/空间成本
1、空间成本:每个线程占用的空间512kb
2、时间成本:创建一个线程 大约90毫米
3、线程间的通信,多线程的数据共享
总结:线程之间是cpu切换执行
1、老板——主线程(UI线程)
程序的入口:main (AppDelegate)程序的生命周期
所有的代码都是通过线程执行的
主线程干的都是ui相关的事
performSelectioInBackground
重点:Ios中多线程的实现方案:
1、pthread:历史悠久,,表示一种可以跨平台的方法,一段代码可以在iphoneandroid、windows几乎不用:语言C
使用难度大,程序员要自己管理它的生命周期,
2、NSThraad (NS开头术语Foundation框架,oc语言,面向对象:封装继承动态)
还是要自己管理生命周期,偶尔使用
3、GCD 也是C语言写的,经常被使用,苹果开发的技术,充分利用多核,很好优化,“透明”
自动管理线程
4、NSOperation:(NS OC写的foundation框架中的)
对GCD的封装:相当于继承gcd的优点
比GCD多了一些更简单实用的功能,使用更加面向对象
ptread的介绍:
p什么意思:p代表POSIX 表示可移植(跨平台)
1系统导入的头文件,用尖括号
#import<pthread.h>
pthread_create:
参数一、pthread_t:线程的标示
参数二:ptheard_attr:attribute:属性
c语言的话为空填入NULL
参数三、:void *(*)(void *) :函数签名
void *代表:约等于oc中的id 任意一个对象 返回值
(*)函数名
(void *)参数
创建一个函数 线程要运行的函数:
void * task (void *param)
{
return NULL;
}
填入:task:函数的首地址
参数四:
void *restrict:给第三个参数的函数一个参数
NULL;
5、pthread _create返回值是一个数字 “0”代表成功,非0则失败
if(result == 0)
NSLog(@“ok”);
说明线程创建成功了
6、 [NSThread currentThread]:打印当前线程
只要number不等于1 就是一个子线程,number=1就是一个主线程中运行
[_bridge NSString]桥接,在oc中写c
桥接的意思是:默认ARC下对OC对象有内存管理,不对C变量管理,桥接的作用是,C变量在适当的时候被释放
总结:
1、导入头文件
2、创建线程pthread_Create
3、创建函数方法 void *task(void*param)
4、传递参数
二、NSThread的简单介绍
NSThread=[NSThread alloc
initWithTarget:]
参数1:对象
参数2:方法
参数3:方法需要的参数
NSThread这样创建是不会跑的
这样写只是在内存中创建一个对象
2、开启线程
[thread start]
方法二、创建线程:
-(void)demo2
{
//detach:分离,可以理解为创建
detachNewThreadSelector:
参数1、方法
参数2: 对象
参数3:方法需要的参数
[NSThread detachNewThreadSelector。。]
}
方法二的确定:如果你要对NSThread进行其他设置不便
但是代码量少了
方法三、
参数1:方法
参数2:方法的参数
为啥没有参数:因为用的是self
[self performSelectorInBackground
压根没提thread:隐式创建线程
线程的生命周期:
线程的状态:
1、创建线程
2、开启线程:在内存中的变化:多了一个可调度线程池:好多线程,且CPU可以调度它
new(新建)-》就绪(Runnable)——》CPU调度当前线程——》运行(running-》阻塞状态-》运行-》死亡
就绪:这个线程除了CPU资源之外,别的资源都已到位
cpu的来回切换,使CPU在当前线程和别的线程之间来回切换,而线程则在运行和就绪这两个状态之间来回切换
运行的时候,如果除了cpu资源外,其它资源也没有了,那么就会调用Sleep方法\等待同步锁
因为不可调度,就会进入阻塞状态 离开可调度线程池
要是苏醒了 线程会从阻塞状态进入运行状态吗?
不会! 这时候不会直接到运行状态,而是回到就绪状态(sleep倒是\得到同步锁)
线程任务执行完毕 会死亡(死亡可以是自杀:也可以是他杀:强制结束线程)
三、NSThread的常用属性
线程确实是通过切换来进行
同时创建两个线程
第一个0时由哪个线程打印出来的?
不清楚:那就给线程起名字
thread.name =@“ ”
thread.threadPirority
多线程的基本概念总结:
1、同步
2、异步
区别:同步是任务顺序执行,异步是同时间可多个运行
3、进程:当前计算机中正在运行的应用程序
4、线程:进程的基本执行单元,一个进程中有一个或多个线程
5、多线程的生命周期和常见属性
特点:线程来回切换运行
主线程:不能在主线程执行耗时操作
优点:
适当的提升资源的利用率
提升程序的执行效率
缺点:
线程不是开的越多越好
因为:时间成本大约90毫秒和空间成本大约512kb
pthread了解:
NSThread 有三种创建方式
1、alloc initWithTargrt
2、detachNew
3、performSelectorInBackground
线程的生命周期:
1、新建
2、就绪
3、运行
4、阻塞
5、死亡
常见属性
1、name
2、优先级threadPirorty
Objective-c——多线程开发第一天(pthread/NSThread)的更多相关文章
- 4.1/4.2 多线程进阶篇<上>(Pthread & NSThread)
本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末 如果觉得本文内容过长,请前往本人 “简书” 本文源码 Demo 详见 Githubhttps://github.com/shorfng ...
- iOS多线程开发--NSThread NSOperation GCD
多线程 当用户播放音频.下载资源.进行图像处理时往往希望做这些事情的时候其他操作不会被中 断或者希望这些操作过程中更加顺畅.在单线程中一个线程只能做一件事情,一件事情处理不完另一件事就不能开始,这样势 ...
- 多线程开发之一 NSThread
每个 iOS 应用程序都有个专门用来更新显示 UI 界面.处理用户的触摸事件的主线程,因此不能将其他太耗时的操作放在主线程中执行,不然会造成主线程堵塞(出现卡机现象),带来不好的用户体验. 一般的解决 ...
- iOS多线程编程Part 1/3 - NSThread & Run Loop
前言 多线程的价值无需赘述,对于App性能和用户体验都有着至关重要的意义,在iOS开发中,Apple提供了不同的技术支持多线程编程,除了跨平台的pthread之外,还提供了NSThread.NSOpe ...
- ios 多线程开发(二)线程管理
线程管理 iOS和OS X中每一个进程(或程序)由一个或多个线程组成.程序由一个运行main方法的线程开始,中间可以产生其他线程来执行一些指定的功能. 当程序产生一个新线程后,这个线程在程序进程空间内 ...
- iOS多线程开发资源抢夺和线程间的通讯问题
说到多线程就不得不提多线程中的锁机制,多线程操作过程中往往多个线程是并发执行的,同一个资源可能被多个线程同时访问,造成资源抢夺,这个过程中如果没有锁机制往往会造成重大问题.举例来说,每年春节都是一票难 ...
- iOS多线程开发
概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操 ...
- 玩转iOS开发 - 多线程开发
前言 本文主要介绍iOS多线程开发中使用的主要技术:NSOperation, GCD. NSThread, pthread. 内容依照开发中的优先推荐使用的顺序进行介绍,涉及多线程底层知识比較多的NS ...
- [ios2]使用NSOperationQueue简化多线程开发和队列的优先级 【转】
多线程开发是一件需要特别精心的事情,即使是对有多年开发经验的工程师来说. 为了能让初级开发工程师也能使用多线程,同时还要简化复杂性.各种编程工具提供了各自的办法.对于iOS来说,建议在尽可能的情况下避 ...
随机推荐
- Appium自动化测试1 - 安装部署
主要参考文章“虫师”自动化部署教程,不过结合自己的一些情况记录此博客~ 1.准备安装包 1)jdk; 下载及安装过程省略,我下载的是jdk1.7版本. 2) adt&SDK; SDK下载的是e ...
- java高薪之路__008_Annotation
元注解 共有4种 @Retention 表示需要在什么级别保存该注释信息(生命周期) |--- RetentionPolicy.SOURCE: 停留在java源文件,编译器被丢掉 |--- Reten ...
- 解决JSP路径问题的方法(jsp文件开头path, basePath作用)
原文:http://blog.csdn.net/mingxunzh/article/details/4627185 在JSP中的如果使用 "相对路径" 则有可能会出现问题. 因为 ...
- C学习笔记(八)字符输入输出和输入确认
缓冲区 缓冲区分为两类:完全缓冲(fully buffered)I/O和行缓冲(line-buffered)I/O.完全缓冲在缓冲区满时被清空(内容被发送至目的地).这种类型常出现在文件输入中.缓冲区 ...
- 【转】关于 Web GIS
以下部分选自2015-03-01出版的<Web GIS从基础到开发实践(基于ArcGIS API for JavaScript)>一书中的前言部分: Web GIS 概念于1994 年首次 ...
- 【汇编】mov [1000],bx:immediate operand not allowed
],bx;在目的操作数中编译器会忽略[],所以[1000]就成了立即数,出现“immediate operand not allowed”改: ;mov bx,[1000];而在源操作数中,就不会出现 ...
- ios基础篇(二十)—— UIBezierPath绘制
UIBezierPath类可以创建基于矢量的路径,可以定义简单的形状,如椭圆或者矩形,或者有多个直线和曲线段组成的形状. 一.UIBezierPath使用: 1.创建path: 2.添加路径到path ...
- NetworkComms V3 之同时监听多端口
NetworkComms网络通信框架序言 NetworkComms通信框架,是一款来自英国的c#语言编写的通信框架,历时6年研发,成熟稳定,性能可靠. 框架支持同时监听服务器上的多个端口,写法如下 ...
- iOS 通过 JSPatch 实时修复线上 bug!
JSPatch 是一个开源项目(Github链接),只需要在项目里引入极小的引擎文件,就可以使用 JavaScript 调用任何 Objective-C 的原生接口,替换任意 Objective-C ...
- UI的一些方法(按钮和线)
//设置按钮字体颜色 [self.determineBtn setTitleColor:[UIColor colorWithHexString:@"0xff9500"] forSt ...