在讲多线程编程之前先简单概括下几个概念。(这里就不细讲线程和进程的差别了,同学们可以自行百度):
概念一:
队列:是管理线程的,相当于线程池,能管理线程什么时候执行。
队列分为串行队列和并行队列等
串行队列:队列中的线程按顺序执行(不会同时执行)
并行队列:队列中的线程会并发执行。可能会有一个疑问,队列不是先进先出吗,如果后面的任务执行完了,怎么出去的。这里需要强调下,任务执行完毕了,不一定出队列。只有当前面的任务执行完了才会出队列。
同步与异步
同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。使用者通过单个线程调用服务;该线程发送请求,在服务运行时阻塞,并且等待响应。
异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。使用者通过两个线程调用服务;一个线程发送请求,而另一个单独的线程接收响应。
在网络数据交互中:
1.同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作。
2、异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对UI进行操作,程序可以继续运行
队列:是管理线程的,相当于线程池,能管理线程什么时候执行。
队列分为串行队列和并行队列等
串行队列:队列中的线程按顺序执行(不会同时执行)
并行队列:队列中的线程会并发执行,可能会有一个疑问,队列不是先进先出吗,如果后面的任务执行完了,怎么出去的了。这里需要强调下,任务执行完毕了,不一定出队列。只有前面的任务
串行队列同步:操作不会新建线程、操作顺序执行
串行队列异步:操作需要一个子线程,会新建线程、线程的创建和回收不需要程序员参与,操作顺序执行,“最安全的选择”
并行队列同步:操作不会新建线程、操作顺序执行
并行队列异步:操作会新建多个线程(有多少任务,就开n个线程执行)、操作无序执行;队列前如果有其他任务,会等待前面的任务完成之后再执行;场景:既不影响主线程,又不需要顺序执行的操作
全局队列异步:操作会新建多个线程、操作无序执行,队列前如果有其他任务,会等待前面的任务完成之后再执行
全局队列同步:操作不会新建线程、操作顺序执行
主队列异步:操作都应该在主线程上顺序执行的,不存在
1:首先简单介绍什么叫线程
可并发执行的,拥有最小系统资源,共享进程资源的基本调度单位。
共用堆,自有栈(官方资料说明iOS主线程栈大小为1M,其它线程为512K)。
并发执行进度不可控,对非原子操作易造成状态不一致,加锁控制又有死锁的风险。
2:IOS中的线程
iOS主线程(UI线程),我们的大部分业务逻辑代码运行于主线程中。
没有特殊需求,不应引入线程增加程序复杂度。
应用场景:逻辑执行时间过长,严重影响交互体验(界面卡死)等。
如果有人问ios中多线程有几种,应该很多人会说三种。其实应该有四种,还有一种pthread。
下面先让我们来看下各个线程相互直接的区别和一些使用场景。
从上图可以看出我们在ios开发中一般使用到的线程主要有三种,分别是:
(一)NSThread
(二)Cocoa NSOperation
(三)GCD(全称:Grand Central Dispatch)
所以pthread在这里就不详细介绍,笔者其实也没有用过。