多线程

pthread:基于c,跨平台,

 2、NSThread,基于oc 面向对象,可以直接操作线程对象,但是需要管理内存。

a、可以获取主线程[NSThread  mainThread];

b、判断当前方法是否在主线程执行:[MSThread isMainThread];

c、[NSThread currentThread];获取当前线程时可以设置名字:
thread.name = @"** " 这样打印的时候可以看到(nam = ** , num = *);

d、创建新线程NSThread *thread = [[NSThread alloc] initWithTarget:(目标) selector:(目标要调用的方法) object:(如要传参数可以用) ];

这样可以创建线程实例,然后必须开启才会执行;[thread start];

不用开启后台隐形默认执行:

[self performSelectorInBackground:@selector(download) withObject:];

但是这个方法无法拿到线程实例,无法进行比如setName的操作

e、休眠:[NSThread sleepForTimeInterval];

GCD:纯c语言,可以充分利用设备的多核,自动管理:线程创建,销毁都自动管理

a、不需要管理线程对象,只需要告诉线程你想执行的任务,不需要管理线程代码

核心点:任务和队列

将你想要的任务放到队列中,gcd会自动将队列中的任务放入对应的线程中,所以这样可以让我们和线程隔离开来;我们只需要判断任务是否需要开启新线程,在线程中的执行方式即可,但是干预不了具体开了几个线程,完全由GCD后台管理

任务:主要影响能不能开启新线程

dispatch_asyn()将block放入队列中就完成了,不用等待block完成就返回。所以这里main队列只能用asyn,就相当于fun(){

dispatch_asyn(main_queue,block1),

}如果用的同步,需要等待将block1放入fun()后面,等待block执行完才能返回,但是block1又放入了fun()后面所以死锁,如果用了异步,只是将其放入fun()后asyn就已经返回,这时fun()已经完成了任务,然后block1再执行,相当于asyn是一个任务,block是另外一个任务,两个分开了。所以是异步

dispatch_syn()跟block同步,需要将Block放入队列,并且等待block完成才返回。

异步任务:可以在新线程中国祚,具备开启子线程能力

同步任务:只能在当前线程执行,不具备开启新线程能力;

GCD还提供几个实用方法:dispatch_after();

dispatch_once:可以让方法只调用一次

static dispatch_once_t once;

dispatch_once(&once , block);不管是哪个对象的,只要声明这里的方法只会执行一次而且是多线程安全的

dispatch_group_t group。队列组,可以将几个不同队列放入组中,然后等所有队列任务都完成以后可以用这个方法;

dispatch_group_notify:

队列:主要影响任务执行方式,即,串行只开启一个线程,一个一个执行任务,并行可开启多个线程,并行执行

dispatch_queue_t queue = dispatch_queue_create("队列名称",null)nul为串行

并行可以开启全局队列 dispatch_get_global_queue(这里是优先等级,默认就可以,0);

并行队列:让多个任务并行执行(其实就是自动开启多个子线程来同时执行任务),并发功能只有在异步有效

串行队列:让任务一个一个按照顺序执行

主队列:dispatch_get_main_queue放入其中会自动在主线程执行

NSOperation:基于GCD,包装成面向对象,多一些使用功能,自动管理线程

线程状态:runnable 可执行:running,执行;阻塞:sleep/同步锁

防止线程间资源抢夺:@synchronized(锁头:一个锁只用一个对象来表示,一般可以用self) 

同原子性atomic:可以在set方法中让属性线程安全;

线程同步:就可以加锁 

原文地址:https://www.cnblogs.com/kankanbujian/p/5759277.html