正文
([[NSThread currentThread] isCancelled]) {
[NSThread
exit
];//执行
exit
,后边的语句不再执行,可以通过 start 再次启动线程
}
if
([[NSThread currentThread] isCancelled]) {
return
;//后边的语句不再执行,不可以通过 start 再次启动线程
}
复制代码
线程通讯:
线程间通信,最常用的就是开启子线程进行耗时操作,操作完毕后回到主线程,进行数据赋值以及刷新主线程UI。
[self performSelectorOnMainThread:@selector(backToMainThread:) withObject:image waitUntilDone:YES];
复制代码
[self performSelector:@selector(backToMainThread:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES];
复制代码
线程安全:
多线程操作会存在一定的安全隐患。原因是多线程会存在不同线程的资源共享,也就是说我们可能在同一时刻两个线程同时操作了某一个变量的值(资源竞争),但是线程的对变量的操作不同,导致变量的值出现误差。
例如:如果有一个变量x = 100,有两个线程A和B,A线程取x的值(x=100),B线程取x的值(x=100),B线程给x+1 (x=101),A线程给x+1 (x = 101),B 线程取x的值 (x = 101)或者( x = 102 )。变量出行了误差。
解决方案添加线程锁,有多种线程锁,在这里不多介绍。
GCD
基于C语言编写由苹果公司提供的的一套多线程开发解决方案,使用时会以函数形式出现,且大部分函数以dispatch开头。它会自动利用多核进行并发处理和运算,它能提供系统级别的处理,而不再局限于某个进程、线程,线程的生命周期由系统自动管理(创建,调度、运行,销毁),只需要告诉GCD执行什么任务,不需要编写管理线程的代码。
基本使用
创建列队和任务:
创建列队(queue)
dispatch_queue_t queue = dispatch_queue_create("10900900",DISPATCH_QUEUE_SERIAL);
复制代码
dispatch_queue_t queue = dispatch_queue_create("10900901",DISPATCH_QUEUE_CONCURRENT);
复制代码
-
全局列队(本质是一个并发队列,由系统提供,所有应用程序共享的,方便编程,可以不用创建就直接使用)
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
复制代码
-
主列队(专门调度主线程的任务,不开辟新的线程。在主队列下的任务不管是异步还是同步都不会开辟新线程,任务只会在主线程顺序执行)
dispatch_queue_t queue = dispatch_get_main_queue();
复制代码
创建任务(sync 和 async)
-
同步任务(同步串行和同步并发,任务执行的方式是一样的,没有开辟新的线程,所有的任务都是在一条线程里面执行。)
dispatch_sync(queue, ^{
});
复制代码
-
异步任务(异步串行和异步并发,任务执行的方式是有区别的,异步串行会开辟一条新的线程,队列中所有任务按照添加的顺序一个一个执行,异步并发会开辟多条线程,至于具体开辟多少条线程,是由系统决定的。)
dispatch_async(queue, ^{
});
复制代码
列队和任务的组合各种情况分析:
-
所有任务都是在当前线程中执行,没有开启新的线程(同步方法不具备开启新线程的能力)
-
同步任务需要等候列队中的任务执行结束,才会执行下一个
-
并发列队可以开启多线程,并且可以同时执行多个任务,但是同步任务无法创建新线程,所以只有当前一个线程,而且同步任务需要等待列队中前一任务执行结束才能继续执行下面的操作,因此任务只能一个一个顺序执行
-
和同步任务,并发列队相似
-
所有任务在当前线程中执行,没有开启新的线程
-
任务是按照顺序执行的,同步任务,线程需要等待列队中的任务执行完毕,才可以开启新的任务
-
在主线程中调用会出现死锁,互相等待
-
死锁原因:当我们在主线程中添加这个列队的时候,添加列队的这个操作本身就是一个任务,我们把它当作任务A,这个任务也被添加到了主线程的列队中。而同步任务,会等待当前列队中前面的任务执行完毕后接着执行,我们把添加到主线程中的列队中的任务称为任务B,这就产生了一个矛盾,任务B要执行需要等任务A执行完毕后才会执行,而任务A执行完毕需要任务B执行结束(因为任务B在任务A中),这就产生了任务互相等待的情况
-
有几个异步任务就开启了几个新的线程,任务也是同时执行的(异步方法具备开启新线程的能力,可以同时执行多个任务)
-
异步执行,当前线程不等待,直接开启新的线程来执行,在新线程中执行任务(异步任务,添加异步任务的线程不做等待,可继续执行别的任务)
-
开启了一条新的线程来执行异步任务(异步任务可以开启新线程,串行列队只能开启一个线程)
-
线程不会等待任务执行完毕,任务的执行是按照顺序来的,每次只有一个任务被执行,任务一个接一个的执行下去
-
没有开启新线程,所有任务都是在主线程中执行的(虽然异步任务有开启新线程的能力,但因为是在主列队,所以无法开启新线程,所有任务都在主线程中执行)
-
由于只有一个线程可以使用,所以所有任务都是按顺序一个个执行的,一个完毕,执行下一个
线程间的通信
线程间的通讯比较常用的就是在其他线程获取数据,然后返回主线程刷新UI界面