①什么是线程?什么是进程?安全
线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元多线程
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操做系统结构的基础。异步
引用网上一个很形象的例子,一个软件就像一个工厂,工厂里有分管各项职能的车间(进程),可是因为资源等因素限制,同时每次只能有一个车间(进程)工做,可是一个车间里有许多工人(线程),能够由他们中的一我的或由多我的组成一个团队,由这个团队里的人来共同完成一项生产任务,在一个团队(A)进行一项生产任务时,其余团队(B)是没法参与该项生产任务的(此处的内存被A占用)。async
②什么是多核?atom
即多内核(multicore chips)是指在一枚处理器(chip)中集成两个或多个完整的计算引擎(内核)。spa
再引用网上一个很形象的例子,好比说搬砖,给你100只手,你把这100只手所有装到一我的的身上,那么这就是多核,多核的好处显而易见,确定比2只手搬砖快,可是缺点就是受限于人自己(CPU),若是重量太大,人的脊柱就会被压断。操作系统
③为何要使用多线程?线程
好比执行下面这段代码code
for (int i = 0; i < 100000; i++) { NSLog(@"i = %d",i); } self.view.backgroundColor = [UIColor greenColor];
咱们会发现,要在执行循环语句10万次后,才开始执行设置背景颜色的语句,这就是所谓的主线程卡死。htm
多线程就是让程序在同一时间,执行多个任务。
④多线程的几种方法
(1)NSThread
特色:代码量大,很麻烦,线程间通讯困难不安全
(2)NSOperation
特色:能控制线程间的通讯,但不灵活
(3)GCD
特色:调用灵活,线程间通讯简单,支持多核且效率最高
一. GCD的原生使用
//建立子线程 dispatch_queue_t t=dispatch_queue_create("XIAOBAIGUAN", NULL); //async--异步 sync--同步 dispatch_async(t, ^{ for (int i = 0; i< 100000; i++) { NSLog(@"i - %d",i); } });
二.GCD
https://pan.baidu.com/s/1hr928y4
#import "GCD.h"
//默认子线程 [GCDQueue executeInGlobalQueue:^{ //默认子线程中执行代码 for (int i = 0; i < 30000; i++) { printf("aaa\n"); } //UI部分回到主线程中执行 [GCDQueue executeInMainQueue:^{ self.view.backgroundColor = [UIColor greenColor]; }]; }];
三.GCDGroup多线程组的使用
//初始化 GCDGroup *group=[GCDGroup new]; //子线程执行,把当前子线程代码规划到一个组 //[GCDQueue globalQueue] - 获取到globalQueue线程 execute-执行 [[GCDQueue globalQueue]execute:^{ NSLog(@"下载资料1"); NSLog(@"资料1结束"); } inGroup:group]; [[GCDQueue globalQueue]execute:^{ NSLog(@"下载资料2"); NSLog(@"资料2结束"); } inGroup:group]; //当Group里面全部成员都执行完,会进入到这个notify方法中 [[GCDQueue mainQueue]notify:^{ NSLog(@"开始游戏"); } inGroup:group]; 注意:子线程不是顺序执行
四.GCDTimer的使用方法
@property(nonatomic,strong)GCDTimer *timer;
//timeInterval- 时间间隔 //delay - 首次执行前的延迟 //NSEC_PER_SEC- 一秒 self.timer=[[GCDTimer alloc]initInQueue:[GCDQueue mainQueue]]; ////计时器执行的代码 [self.timer event:^{ NSLog(@"嘀哒嘀"); } timeInterval:NSEC_PER_SEC * 3 delay:NSEC_PER_SEC*3];
//开始 [self.timer start]; //结束后销毁 [self.timer destroy];
五.GCDSemaphore信息源的使用方法
[GCDQueue executeInGlobalQueue:^{ NSLog(@"执行1"); //等待命令 [semaphore wait]; NSLog(@"执行3"); }]; [GCDQueue executeInGlobalQueue:^{ NSLog(@"执行2"); sleep(5); //发出信号 [semaphore signal]; }];
这两段代码的执行顺序以下: