多线程

iOS中的多线程技术

1 pthread

2 NSThread

3 GCD

4 NSOperation

在iOS中主要使用后面两种技术。


一 pthread

POSIX线程(POSIX threads),简称Pthreads,是线程的POSIX标准。该标准定义了创建和操纵线程的一整套API。在类Unix操作系统(Unix、Linux、Mac OS X等)中,都使用Pthreads作为操作系统的线程


二 NSThread

NSThread是OC对象,所以操作相对于pthread来说简单许多,但是还是需要开发者手动管理线程。

常见用法

1 开线程三种方式

(1)

- (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(nullable id)argument

(2)

+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(nullable id)argument;

(3)

- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg

第一种方式可以配置线程,但是需要手动开启

后两种方式自动开启线程,但是无法配置。


2.判断当前线程

    [NSThread currentThread];
    [NSThread mainThread];
    [ThreadXXX isMainThread];


3. 线程间通信

在实际过程中,我们会遇到一些耗时的操作(比如下载图片),在此情况下,为了不影响用户体验,我们需要新开子线程用于下载图片。当图片下载完成的时候,我们需要回到主线程(iOS中与UI相关的操作放到主线程中执行)中刷新图片。

[self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:NO];

也可以指定特定的线程

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait NS_AVAILABLE(10_5, 2_0)



二 GCD

用法比线程简单且高效,不需要手动管理线程。

dispatch queues 三种

1 serial queues 串行队列

同一时刻只能执行一个任务(按照任务添加顺序执行)。多个串行队列可以并发执行,互不影响。

2 ConCurrent queues 并行队列

同一时刻可以执行多个任务(按照任务添加顺序执行)。系统提供了四种并发队列。也可以自己创建。

3 main dispatch queues 主队列

串行队列,在主线程中执行。


相对于NSThread的优势

1 简单

2 多个线程对同一资源的操作,NSThread需要加锁,而在GCD中可以将两个任务放到串行队列中执行。


串行队列内存管理。

常见用法

同步与异步的区别:是否阻塞当前线程.

1 dispatch_async()函数,异步

//获取全局并发队列(系统提供的)
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //添加任务,异步方式
    dispatch_async(queue, ^{
    //会开新线程
        NSLog(@"%@",[NSThread currentThread]);
    });
    //再添加任务
    dispatch_async(queue, ^{
    //会开新线程
        NSLog(@"%@",[NSThread currentThread]);
    });

2 dispatch_sync()函数,同步方式,不开启线程.


                                    serail queues                       ConCurrent queues                  main queues

dispatch_aysnc              开启一条新线程                      开启一条或者多条新线程              不开

dispatch_sysnc              不开                                     不开                                        不开


3线程间通信(还是以下载图片为例)

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
        dispatch_async(queue, ^{
            //..下载图片
            //回到主线程中(相对于当前线程是异步,但是不开新的线程)
            dispatch_async(dispatch_get_main_queue(), ^{
                //..更新图片
            });
        });
    }


GCD其他的技术

dispatch_group,用于线程执行顺序

dispatch_semaphors,用于线程同步(多个线程按照一定顺序执行,比如对资源的访问)

dispatch Sources

dispatch_after 


你可能感兴趣的:(多线程)