多线程 NSThread

多线程
NSThread

创建和启动线程

一个NSThread对象就代表一条线程

创建、启动线程

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];

[thread
start];

//
线程一启动,就会在线程thread中执行self的run方法

主线程相关用法

+
(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;

其他创建线程方式

创建线程后自动启动线程

[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];

隐式创建并启动线程

[self performSelectorInBackground:@selector(run) withObject:nil];

上述2种创建线程方式的优缺点

p优点:简单快捷

p缺点:无法对线程进行更详细的设置

线程的状态

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];

[thread
start];

控制线程状态

启动线程

-
(void)start;

//
进入就绪状态 -> 运行状态。当线程任务执行完毕,自动进入死亡状态

阻塞(暂停)线程

+
(void)sleepUntilDate:(NSDate *)date;

+
(void)sleepForTimeInterval:(NSTimeInterval)ti;

//
进入阻塞状态

强制停止线程

+
(void)exit;

//
进入死亡状态

注意:一旦线程停止(死亡)了,就不能再次开启任务

多线程的安全隐患

资源共享

p1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源

p比如多个线程访问同一个对象、同一个变量、同一个文件

当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题

安全隐患示例01 – 存钱取钱

安全隐患示例02 – 卖票

安全隐患分析

安全隐患解决 – 互斥锁

安全隐患解决 – 互斥锁

互斥锁使用格式

@synchronized(锁对象) { // 需要锁定的代码  }

注意:锁定1份代码只用1把锁,用多把锁是无效的

互斥锁的优缺点

p优点:能有效防止因多线程抢夺资源造成的数据安全问题

p缺点:需要消耗大量的CPU资源

p

互斥锁的使用前提:多条线程抢夺同一块资源

p

相关专业术语:线程同步

p线程同步的意思是:多条线程按顺序地执行任务

p互斥锁,就是使用了线程同步技术

p

ü

原子和非原子属性

OC在定义属性时有nonatomic和atomic两种选择

patomic:原子属性,为setter方法加锁(默认就是atomic)

pnonatomic:非原子属性,不会为setter方法加锁

p

atomic加锁原理

@property (assign, atomic) int age;

-
(void)setAge:(int)age

{

@synchronized(self) {

_age = age;

}

}

原子和非原子属性的选择

nonatomic和atomic对比

patomic:线程安全,需要消耗大量的资源

pnonatomic:非线程安全,适合内存小的移动设备

p

iOS开发的建议

p所有属性都声明为nonatomic

p尽量避免多线程抢夺同一块资源

p尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力

线程间通信

什么叫做线程间通信

p在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信

p

线程间通信的体现

p1个线程传递数据给另1个线程

p在1个线程中执行完特定任务后,转到另1个线程继续执行任务

p

线程间通信常用方法

-
(void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;

-
(void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;

p

p

线程间通信示例 – 图片下载

时间: 2024-08-09 22:02:00

多线程 NSThread的相关文章

多线程——NSThread、GCD、NSOperation

1.前言: 一个应用程序就是一个进程,一个进程至少包含一个线程,程序启动会自动创建一个主线程,负责UI界面的现实和控件事件的监控.多线程可以更充分的利用系统CPU资源,一定程度上提升程序的性能.1个进程可以开启多条线程,每条线程可以并行(同时)执行不同的任务.在一个线程内可以包含多个事物(要干的活),在线程内依据先进先出的特性串行执行…… 2.NSThread - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"main thread is %@

iOS多线程 NSThread/GCD/NSOperationQueue

http://www.cnblogs.com/kenshincui/p/3983982.html iOS开发系列--并行开发其实很容易 2014-09-20 23:34 by KenshinCui, 9738 阅读, 19 评论, 收藏,  编辑 --多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种

IOS UI多线程 NSThread 下载并显示图片到UIImageView

效果图 @property (weak,nonatomic)IBOutletUILabel *downLabelInfo; @property (weak,nonatomic)IBOutletUIImageView *imageView; @end @implementationViewController - (void)viewDidLoad { [super viewDidLoad]; NSString *url  [email protected]"http://d.hiphotos.b

iOS多线程与网络开发之多线程NSThread

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 游戏官方下载:http://dwz.cn/RwTjl 游戏视频预览:http://dwz.cn/RzHHd 游戏开发博客:http://dwz.cn/RzJzI 游戏源代码传送:http://dwz.cn/Nret1 A.NSThread的基本使用 1.创建和启动线程 一个NSThread对象就代表一条线程

iOS 多线程NSThread理解与场景示例

NSThread是相对GCD和NSOperationQuene而言,比较轻量级的一种多线程处理方式. 但同时,它的弊端就是需要自己管理线程的生命周期,以及线程同步:而另外两种不需要自己管理. 常见方法介绍: 一.获取当前线程 NSThread *current = [NSThread currentThread]; 二.获取主线程 NSThread *main = [NSThread mainThread]; 三.NSThread的创建 1 // 初始化线程 2 NSThread *thread

iOS:多线程NSThread的详细使用

NSThread具体使用:直接继承NSObject NSThread:. 优点:NSThread 是轻量级的,使用简单 缺点:需要自己管理线程的生命周期.线程同步.线程同步对数据的加锁会有一定的系统开销 1.属性 @property (readonly, retain) NSMutableDictionary *threadDictionary;  //线程字典 @property double threadPriority;                                  

多线程 NSThread GCD

ios多线程实现种类 NSThread NSOperationQueue NSObject GCD *************** 1.NSThread //线程 第一种 NSThread *thread1=[[NSThread alloc] initWithTarget:self selector:@selector(sum) object:nil]; // //    //给线程起名字 [email protected]"thread1"; //    //启动线程 [thread

转载的一篇关于iOS里多线程NSThread/NSOperation/GCD的文章

转载 IOS多线程编程对于初学者来说,总是会觉得很难理解和掌握,现在通过几个实例来更加系统全面的理解IOS多线程编程,希望对大家有所帮助. 1:首先简单介绍什么叫线程可并发执行的,拥有最小系统资源,共享进程资源的基本调度单位.共用堆,自有栈(官方资料说明iOS主线程栈大小为1M,其它线程为512K).并发执行进度不可控,对非原子操作易造成状态不一致,加锁控制又有死锁的风险. 2:IOS中的线程iOS主线程(UI线程),我们的大部分业务逻辑代码运行于主线程中.没有特殊需求,不应引入线程增加程序复杂

[iOS]深入浅出 iOS 之多线程 NSThread

http://www.cocoachina.com/bbs/read.php?tid=43852 OS 支持多个层次的多线程 编程,层次越高的抽象程度越高,使用起来也越方便,也是苹果最推荐使用的方法.   下面简要说明这三种不同范式:  Thread 是这三种范式里面相对轻量级的,但也是使用起来最负责的,你需要自己管理thread的生命周期,线程 之间的同步.线程 共享同一应用程序的部分内存空间,它们拥有对数据相同的访问权限. 你得协调多个线程 对同一数据的访问,一般做法是在访问之前加锁,这会导