NSThread使用总结

一、创建NSThread:
(1)使用NSThread类方法:detachNewThreadSelector:toTarget:withObject:
该方法3个参数分别指定了线程执行的方法,目标,和传递的对象。但是要注意,使用这个方法时,并没有返回任何对象供操作,所以无法管理生成的线程。该方法让系统分发出一个线程,管理权归系统所有。
(2)使用NSObject的实例方法:performSelectorInBackground:withObject:该方法效果和第一个方法基本上一样,目标为对象本身。
(3)使用NSThread的实例方法:initWithTarget:selector:object:该方法3个参数分别指定了线程执行的方法,目标,和传递的对象。初始化之后,手动调用start方法启动线程。线程对象由自己管理。
(4)子类化NSThread的方法:写一个类继承自NST hread类,重写-(void)main;方法。手动调用Start方法启动线程。

二、线程的内存管理:
在工程的主函数中,有系统自动创建的NSAutoreleasePool对象,供在主线程中运行的对象使用。在创建其它的线程时,NSAutoreleasePool对象需要自己来创建、管理。不使用NSAutoreleasePool的后果是,系统中自动释放的对象无法被最终释放,像滚雪球一样越滚越大,最终导致系统崩溃。

三、线程相关属性方法:
(1)设置线程名称:setName。
(2)配置线程的堆栈大小:setStackSize,需要在启动线程前调用。
(3)配置线程字典:threadDictionary,我们可以在返回的字典中添加需要保存的键值对,在该线程执行期间都有效。
(4)设置线程的优先级:setThreadPriority,值从0到1。代表最低到最高。
(5)当前线程状态:
isExecuting
isFinished
isCancelled
isMainThread
(6)线程环境状态
isMultiThreaded
currentThread
(7)线程等待以及退出
sleepUntilDate:
sleepForTimeInterval:
exit
cancel

四、线程间的通讯:线程间的通讯使用performSelector系列方法:
(1)在应用程序主线程中做事情:
performSelectorOnMainThread:withObject:waitUntilDone:
performSelectorOnMainThread:withObject:waitUntilDone:modes:
(2)在指定线程中做事情:
performSelector:onThread:withObject:waitUntilDone:
performSelector:onThread:withObject:waitUntilDone:modes:
(3)在当前线程中做事情:
performSelector:withObject:afterDelay:
performSelector:withObject:afterDelay:inModes:
(4)取消发送给当前线程的某个消息
cancelPreviousPerformRequestsWithTarget:
cancelPreviousPerformRequestsWithTarget:selector:object:

五、互斥锁:NSLock类
(1)NSLock的对象可以解决多线程中互斥操作的问题,它有两个内部状态,锁定(locked)和打开(unlocked)。用于解决多个窗口同时买票的情景。
(2)一般使用方法,在互斥代码前后分别加上lock方法和unlock方法。可以为每段互斥代码分别创建一个NSLock对象。
(2)lock方法:申请锁,如果锁为打开状态,将锁置为锁定状态,然后执行互斥代码。如果锁为锁定状态,则线程阻塞,直到申请到锁。
(3)unlock方法:互斥操作完成时,释放锁,将锁置为打开状态。
(4)tryLock方法:该方法返回Bool值,如果成功申请到锁,则返回YES,如果没有申请到锁,则返回NO,但是线程不阻塞。具体操作由程序员根据返回状态自己处理。
(5)lockBeforeDate方法:该方法和tryLock方法类似,返回值也为Bool值。和tryLock不同的是,多了一个时间限制。如果在规定时间内申请到锁,则返回YES,如果没有申请到锁,返回NO。
(6)互斥锁不支持递归,因为第一次申请到锁,在锁释放之前,是不可能再次申请到锁的,线程会锁死。
比如如下代码:
-(void)test(int m){
if(m <= 0){
retun;
}else{
[theLock lock];
m--;
[self test:m];
[theLock unlock];
}
}

六、递归锁:NSRecursiveLock类
(1)递归锁的实例方法和NSLock一样。
(2)NSRecursiveLock支持递归,只要是在一个线程里,锁可以多次被申请,而不会造成死锁。它会记录lock和unlock的次数,然后进行匹配,当两个方法的调用次数相等时,也就是递归执行完毕时,锁就会被释放。

七、条件锁:NSConditionLock类
(1)NSConditionLock类有NSLock类的所有方法,可以用来做互斥操作。增加的其它方法为条件锁方法。
(2)条件锁用来解决生产者-消费者这样情景的问题。
(3)NSConditionLock初始化方法:initWithCondition:,通过一个条件变量初始化。
    假设我们定义两个状态,有票:HAS_PRODUCT,没票:NO_PRODUCT。初始化时为无票。
(4)生产者申请锁:lock,不用有条件,因为生产者生产不需要依赖消费者。
(5)生产者生产完毕之后:使用unlockWithCondition:HAS_PRODUCT方法,释放锁,并且改变状态为有票。
(6)消费者申请锁:lockWhenCondition:HAS_PRODUCT,申请锁,并且在有票的情况下才能获取到锁,否则线程会阻塞。
(7)消费者消费完毕之后:unlockWithCondition:empty?NO_PRODUCT:HAS_PRODUCT。释放锁,如果当前产品消费完了,则将状态修改为没票,否则修改为有票。

八、@synchronized使用
(1)该指令可以完成互斥锁能完成的任务,能够将objective-c中的对象当做一种互斥体来使用。
(2)使用示例:
id object = [[NSObject alloc] init];
@synchronized(object){
//在内部添加互斥操作
}
(3)示例中的object对象相当于一个NSLock对象,它在@synchronized(object)开始的时候被请求,在结束的时候被释放。

九、信号量:NSCondition
(1)NSCodition是一种特殊类型的锁,我们可以用它来同步线程执行的顺序。它分为信号态和非信号态。当NSCondition为等待状态时,为非信号态,反之为信号态。一个处于等待状态的线程,需要等待其它线程给他发送信号,才能唤醒。
(2)等待线程的使用过程:
锁住NSCondition对象;
连续检查条件属性;
若不满足条件,线程进入等待状态(锁自动被打开);
直到满足条件,执行任务;
解除NSCondition锁定
(3)另外一个线程唤醒线程的过程:
锁住NSCondition对象;
改变条件属性的值;
唤醒等待线程(如果只有一个线程在等待,使用signal,当有多个线程在等待,使用broadcast);
解除NSCondition锁定。
(4)示例代码:
NSCondition *theCondition = [[NSCondition alloc] init];
BOOL readyToGo = NO;
----------------------------------------
//线程1代码
[theCondition lock];//请求锁
while (readyToGo == NO){
    [theCondition wait];//线程等待,锁自动打开
}
//在此执行任何代码
[theCondition unlock];//释放锁
----------------------------------------
//线程2代码:
[theCondition lock];//请求锁
readyToGo = YES;//重置条件属性
[theCondition signal];//将NSCondition置为信号态,将唤醒线程1
[theCondition unlock];//释放锁

十、死锁:两个或者两个以上的进程或者线程在执行过程中,因争夺资源而造成一种互相等待的情况。比如:
进程P1、P2,资源R1、R2;P1占用R1,P2占用R2;但此时P1想占用R2,又不想释放R1,P2想占用R1,但是又不释放R2,造成互相等待,从而造成死锁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500144.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

甘肃计算机教室中标,大单纷至沓来 甘肃百亿工程浪潮电脑中标8000台

近日&#xff0c;浪潮电脑教育市场再传佳讯&#xff0c;在甘肃百亿工程项目中&#xff0c;凭借出众的产品性价比和针对细分市场的定制化解决方案&#xff0c;浪潮电脑一举拿下了8000台的采购大单&#xff0c;这是继宁夏中标之后浪潮电脑在百亿工程中的又一成功典范&#xff0c;…

NSOperationQueue简介

一、NSOperationQueue简介1.概述&#xff1a;NSOperationQueue类管理NSOperation对象的执行。NSOperationQueue可以被称为操作队列&#xff0c;NSOperation可以被称为操作。操作被添加到操作队列之后&#xff0c;操作队列会根据操作对象的优先级或者相互之间的依赖关系来执行操…

计算机 窗口打开的方法,如何打开命令行窗口?两种实用的方法介绍

Windows系统中常常会用到命令行窗口&#xff0c;那么我们该如何打开命令行窗口?接下来&#xff0c;小编为大家介绍两种实用的打开命令行窗口的技巧&#xff0c;再也不必担忧如何打开命令行窗口的烦恼了。第一种打开方法1.点击自己的电脑中的开始菜单&#xff0c;在菜单中找到运…

GCD简介一:基本概念和Dispatch Queue

一、什么是GCD&#xff1f;Grand Central Dispatch或者GCD&#xff0c;是一套低层API&#xff0c;提供了一种新的方法来进行并发程序编写。从基本功能上讲&#xff0c;GCD有点像NSOperationQueue&#xff0c;他们都允许程序将任务切分为多个单一任务然后提交至工作队列来并发地…

大学生计算机二级大集报名最好,在校大学生如何报名计算机二级?

2009-12-05 回答首先要根据你的所学专业来衡量自己考哪项计算级二级有c语言&#xff0c; vb&#xff0c; vf&#xff0c; java&#xff0c; access&#xff0c; c 六项可选考其中一个你会的 考下来能拿计算机二级了考试分两部分&#xff0c;上机和笔试。笔试就是一些基本的操作…

GCD简介二:多核心的性能

一、概念为了在单一进程中充分发挥多核的优势&#xff0c;我们有必要使用多线程技术。在低层&#xff0c;GCD全局dispatch queue仅仅是工作线程池的抽象。这些队列中的Block一旦可用&#xff0c;就会被dispatch到工作线程中。提交至用户队列的Block最终也会通过全局队列进入相同…

怪哉翻译软件测试,[东方朔传翻译]东方朔传·怪哉原文与翻译

东方朔传怪哉原文与翻译原文&#xff1a;《太平广记》卷四七三引《东方朔传》汉武帝幸⑦甘泉&#xff0c;驰道中有虫&#xff0c;赤色&#xff0c;头牙齿耳鼻尽具&#xff0c;观者莫识①。帝乃使东方朔视之&#xff0c;还对②曰&#xff1a;“此虫名怪哉。昔时拘系⑧无辜&#…

GCD简介三:Dispatch Sources

一、何为Dispatch Sources简单来说&#xff0c;dispatch source是一个监视某些类型事件的对象。当这些事件发生时&#xff0c;它自动将一个block放入一个dispatch queue的执行例程中。我们到底讨论哪些事件类型&#xff1f;下面是GCD 10.6.0版本支持的事件&#xff1a;Mach por…

GCD简介四:挂起,目标指定,信号量

一、Dispatch Queue挂起dispatch queue可以被挂起和恢复。使用 dispatch_suspend函数来挂起&#xff0c;使用 dispatch_resume 函数来恢复。这两个函数的行为是如你所愿的。另外&#xff0c;这两个还是也可以用于dispatch source。一个要注意的地方是&#xff0c;dispatch que…

如何自己做网站发布到服务器上面,怎么做网站 四步教你搭建自己的网站

1、购买域名如果想要做一个自己的网站&#xff0c;购买一个自己喜欢的域名就是首先要做的&#xff01;当你购买好自己的域名&#xff0c;就走出了搭建自己网站的第一步&#xff01;2、购买空间/主机/服务器空间/主机/服务器&#xff0c;看着好像很复杂&#xff0c;其实很简单&a…

GCD简介五:补充

1.GCD在iOS4.0及以上可用。2.GCD中&#xff0c;主线程队列是串行的&#xff1b;全局队列是并行的&#xff0c;并由整个进程共享&#xff1b;用户自建队列&#xff0c;在iOS4.3以下&#xff0c;只能是串行&#xff0c;iOS4.3及以上&#xff0c;可以是并行的。3.dispatch_suspend…

ajax delete 传递参数,springMVC使用PUT、DELETE方法传递参数解决方案

在web.xml中新增过滤器HiddenHttpMethodFilterorg.springframework.web.filter.HiddenHttpMethodFilterHiddenHttpMethodFilter/*需要注意的是&#xff0c;只有context-type&#xff1a;application/x-www-form-urlencoded的请求才会被过滤。该过滤器的核心方法如下&#xff1a…

ARC简介

1、简介&#xff1a;ARC(Automatic Reference Counting)&#xff0c;自动引用计数&#xff0c;需要XCode4.2和SDK5.0的支持。它是一个在编译期间工作的技术&#xff0c;编译器在编译的时候会根据变量的作用域为objective-c变量添加合适的retain、release、autorelease等函数。原…

微信验证码无法连接到服务器,微信无法连接到服务器1237解决方法

太多朋友在使用微信过程中出现微信无法连接到服务器1237的问题&#xff0c;出现这个问题的原因有很多种&#xff0c;接下来小编带大家找出问题原因&#xff0c;然后成功解决这个问题。以下是网友们成功解决此问题的方法&#xff0c;大家可以参考一下方法一&#xff1a;首先重启…

iOS后台任务

一、概览1.从iOS4.0开始&#xff0c;系统添加了多任务特征&#xff0c;允许应用在按下Home键之后&#xff0c;继续执行后台任务。大部分应用在进入后台之后就进入了挂起状态&#xff0c;只有那些为用户提供重要服务的App能够在进入后台之后继续运行一段时间。2.一般情况下&…

王者荣耀服务器维护bug,8月23日王者荣耀ios版更新一直显示维护是什么情况?更新出现bug 附处理方法...

相信很多喜爱玩王者荣耀的游戏玩家可以知道今天是王者荣耀星计划更新的日子&#xff0c;但是有很多苹果手机的小伙伴出现了一个问题&#xff0c;那就是无法进入游戏&#xff0c;甚至是更新十分的缓慢&#xff0c;在这里本文为您带来最新的解决方法&#xff01;苹果手机微信区一…

服务器任务栏不显示程序,Win10任务栏不显示应用程序标签怎么办?

Win10任务栏不显示应用程序标签怎么办?执拗的人才会一条路走到黑&#xff0c;多个朋友多条路&#xff0c;多个方法多种选择。关于Win10任务栏不显示应用程序标签&#xff0c;一般是explorer进程出现故障导致&#xff0c;哦!忘记说了Win10系统下这东东改了个好听的名字&#xf…

Objective-C复制解析

一、为什么使用复制&#xff1f;1.C语言以及Objective-C语言总是按值传递的&#xff0c;按值传递意味着是隐式复制。在这里就分为两种情况&#xff1a;(1)如果是非对象类型&#xff0c;对传递过来的值进行更改&#xff0c;只会更改副本&#xff0c;对原始值没有影响&#xff0c…

udp协议的服务器是哪种类型,UDP协议

UDP协议1.UDP使用场景域名系统若是执行时间内&#xff0c;没有响应返回&#xff0c;证明包已丢失。音频或视频数据包的丢失只会造成通话或视频的干扰和不清楚&#xff0c;而不会像TCP协议那样造成通话的丢失或卡顿。2.UDP和TCP的类比UDP类似于邮局&#xff0c;数据的接受与否和…

归档和解档-Archiver

一、概念1.归档用于保存对象&#xff0c;包括被归档对象之间的各种相互关系或者依赖性。解档用于重建以前归档的对象与关系。在其它面向对象的语言中&#xff0c;一般使用术语"序列化"来描述归档解档模式。2.归档的对象通常存储为二进制数据&#xff0c;可以在内存或…