多线程-1

进程:在系统中可以独立运行并做为资源分配的基本单位,由一组指令、数据和堆栈等组成,是一个可以独立运行的活动实体。多线程

线程:每一个进程中至少有一个线程(结合iOS开发来讲,每一个进程都至少有一个主线程,又或者说叫UI线程);并发

串行:单个任务执行,一个任务执行完毕后在执行下一个任务;框架

并发:多个任务同时执行(一般为多线程);异步

两者区别:任务的执行方式。async

 

同步:只能在当前线程执行,不具有开启线程的能力;函数

异步:具有开启新线程的能力;多个线程独立执行;无前后顺序的影响;spa

两者区别:是否可以开启新线程。线程

 

在iOS开发的过程当中通常有四种多线程的方法:code

1-pThread (C语言实现    支持多平台   复杂难理解    几乎不用)orm

2-NSThread (OC语言   简单   偶尔使用)

3-GCD   (C语言实现    常常使用  掌握)

4-NSOperation  (对GCD的封装   常常使用  掌握)

NSThread 我的接触到的有3种开启线程的方法:

a, 实例化NSThread类对象,而后调用对象的start方法,手动开启子线程;注:程序猿无需关闭线程,在线程的任务执行完毕后,系统会自动关闭线程。

b,使用类方法 “detach...”来开启子线程,不用手动开启,线程自动启动;

c,隐式开启“perform...”,一样不须要手动开启,线程自动启动;

GCD

在了解GCD以前,咱们须要先了解“队列”和“任务”这连个概念;

GCD有一个机制叫:“队列分发机制”;遵循“FIFO--先进先出,后进后出”;

GCD的框架:lib_dispatch库;

使用步骤:建立队列,而后将任务添加到队列中(上代码:):

//“异步函数 + 并发队列”
    //1,建立队列(DISPATCH_QUEUE_SERIAL--串行队列、DISPATCH_QUEUE_CONCURRENT--并发队列)
    dispatch_queue_t queue = dispatch_queue_create("queue_1", DISPATCH_QUEUE_CONCURRENT);
    
    //2,将任务添加到队列(同步函数dispatch_sync:,异步函数:dispatch_async)
    dispatch_async(queue, ^{
        NSLog(@"-------------%@",[NSThread currentThread]);//任务
    });


    //“同步函数+并发队列”
    dispatch_queue_t queue_2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_sync(queue_2, ^{
        NSLog(@"-------------%@",[NSThread currentThread]);//任务
    });

    //异步函数+串行队列
    dispatch_queue_t queue_3 = dispatch_queue_create("queue_3", DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue_3, ^{
        for (int i = 0; i<10000; i++) {
            NSLog(@"=====%d",i);
        }
         NSLog(@"1-------------%@",[NSThread currentThread]);
    });
    dispatch_async(queue_3, ^{
         NSLog(@"2-------------%@",[NSThread currentThread]);
    });
    dispatch_async(queue_3, ^{
         NSLog(@"3-------------%@",[NSThread currentThread]);
    });

建立队列的几个函数:

dispatch_queue_create(能够建立并发队列、也能够建立串行队列);

全局队列--dispatch_get_global_queue( "队列优先级" ,  0  );(默认为并发队列,当有多个队列时候,队列的优先级才会体现出来)。

主队列--dispatch_get_main_queue,特殊的串行队列,主队列中的任务都会在主线程中执行;

线程阻塞问题!!!--使用sync函数往当前的串行队列添加任务,会卡住当前的串行队列。

//线程卡住,nslog函数不会执行
    dispatch_queue_t queue_4 = dispatch_get_main_queue();
    dispatch_sync(queue_4, ^{
        NSLog(@"2-------------%@",[NSThread currentThread]);
    });

 

 

以上仅为我的理解,如有不对的地方,望你们指出,谢谢。

相关文章
相关标签/搜索