上篇中说到了多线程创建的四种方法,在iOS中使用较多的是后面三种方法。本篇将介绍iOS多线程中NSThread的使用
一.创建和启动线程
1.NSthread有三种创建新线程的方法:
//方法1:
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];‘
thread.name =@"线程1";
//开启线程
[thread start];
//方法2:创建线程对象, 自动开启
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
//方法3:隐式的创建分线程
[self performSelectorInBackground:@selector(run) withObject:nil];
上述后两种创建线程方式的优缺点
- 优点:简单快捷
- 缺点:无法对线程进行更详细的设置
当线程绑定的方法执行完毕之后,线程对象就会被销毁。线程一旦被销毁,就不能再次重新开启。如果想再次执行run方法,必须重新创建新的线程对象
2.主线程的相关用法
// 返回主线程
+ (NSThread *)mainThread;
// 是否为主线程(类方法)
+ (BOOL)isMainThread;
// 是否为主线程(对象方法)
- (BOOL)isMainThread;
3.其他用法
//获得当前线程
NSThread *current = [NSThread currentThread];
//线程的调度优先级
+ (double)threadPriority;
+ (BOOL)setThreadPriority:(double)p;
- (double)threadPriority;
- (BOOL)setThreadPriority:(double)p;
调度优先级的取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高
二.多线程的安全隐患
在多线程中,一块资源可能被多个线程共享,也就是多个线程可能会访问同一块资源。此时很容易引发数据错乱和数据安全问题
举例说明:
针对以上情况,需要使用互斥锁来限制
互斥锁使用格式
@synchronized(
锁对象
) {需要锁定的代码
}
互斥锁的优点和缺点:
- 优点:能有效防止由多线程抢夺资源造成的数据安全问题
- 缺点:需要消耗大量的CPU资源
互斥锁的作用其实就是使多条线程在同一条线上按照顺序去执行,实现线程同步
三.线程间通信
在一个进程中,线程往往不是孤立存在的,多个线程之间经常要进行通信
- 一个线程传递数据给另一个线程
- 在一个线程执行完特定任务后,转到另一个线程继续执行任务
例如:在子线程中下载完图片之后,此时需要切换到主线程中刷新UI展示图片
线程间通信常用方法:
切换到主线程上执行相关任务
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
切换到指定线程中执行相关任务
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;