多线程
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方法中让属性线程安全;
线程同步:就可以加锁