iOS多线程知识(二) - NSThread

iOS多线程知识(一)-基础知识



上篇中说到了多线程创建的四种方法,在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;

你可能感兴趣的:(iOS多线程知识(二) - NSThread)