多线程实战篇

2017-12-01  本文已影响0人  为自己丶拼个未来

创建和启动线程

//创建、启动线程
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];

//设置线程的名字
- (void)setName:(NSString *)name;
- (NSString *)name;

#创建线程后自启动线程
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];

#隐式创建并启动线程
[self performSelectorInBackgrount:@selector(run) withObject:nil];

/*
*上述2种创建线程方式的优缺点
* 优点:简单快捷
* 缺点:无法对线程进行更详细的设置
*/

线程的状态

线程.png

控制线程状态

//启动线程
- (void)start;
//进入就绪状态->运行状态。当线程执行完毕,自动进入死亡状态

//阻塞(暂停)线程
+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;
//进入阻塞状态

//强制停止线程
+ (void)exit;
//进入死亡状态

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

多线程的安全隐患

安全隐患-存取钱

存取钱

2个线程同时余额这块空间,导致余额数据错乱。

安全隐患-卖票

卖票

根据上面的存取钱原理自己推理一下

安全隐患分析

安全隐患分析原理图

安全隐患解决-互斥锁

图片 3.png

原子和非原子属性

线程间通信

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;
上一篇 下一篇

猜你喜欢

热点阅读