进程:在系统中可以独立运行并做为资源分配的基本单位,由一组指令、数据和堆栈等组成,是一个可以独立运行的活动实体。多线程
线程:每一个进程中至少有一个线程(结合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]); });
以上仅为我的理解,如有不对的地方,望你们指出,谢谢。