背景
作为一名程序员,面试的时候最头疼的问题莫过于他问的这个问题~~~
你说我不会吧,我还确实略懂一二。
你说我会吧,我还真不太会表达。
遇到这种情况确实很尴尬~~~~~
事实上,一些在开发过程中很少用到的知识点,我们很容易遗忘,因此想要记住这些知识点,在面试过程中从容不迫,我们该怎么做呢?
今天先从多线程开始讲起~~~
问:你了解多线程吗?讲一讲吧!
OK,既然面试官要我们来讲,那么我们就要把握住这个机会,把面试官带到我们自己的节奏中来。一句话,节奏把握好,offer早点拿~~
最好是自己从头到尾的讲一遍,可以试试按照下面我给的方式去说
好,下面我们就开始
为什么要使用多线程?
还是先举个例子🌰,方便大家理解。
作为程序猿的我,喜欢在写代码的时候抽烟,因此我在工作前需要做的两件事情是:1、买烟 2、写代码。注意这两件事情是有先后顺序的哦,先买烟才能写代码。这样的话是不是很浪费时间呢?
后来,赚钱啦,请了个小秘。现在我在写代码的时候就不要我自己出去买烟了,我可以边写代码边等秘书买烟回来。
这就是单线程(自己一个人做事)和多线程(多个人同时做事)的区别。
因此使用多线程的目的是:
1、解决程序阻塞的问题,我自己出去买烟有可能在路上堵住了,导致我不能写代码
2、提高程序的运行效率
说到多线程就不得不提同步和异步
同步 :一个人执行多个任务,只能依次按顺序执行。上面的例子中,我只能先买烟然后在写代码。
异步:多个人可以同时执行多个任务。上面的例子中,我写代码的过程中让秘书去买烟。
顺带提一嘴进程和线程
进程:进程就是一个正在运行应用程序。
线程:是给进程执行任务的。
因此我们说一个正在运行的进程,必须包含一条线程。
讲完了为什么要使用多线程,下面我们就需要讲讲多线程的优缺点
优点:
1、能适当的提高程序的执行效率
2、能适当提高资源利用率
3、线程上的任务执行完以后,线程会自动销毁
缺点:
1、开启线程需要占用一定的内存空间,如果开启大量的线程,反而会降低程序的性能。
2、线程越多,CPU在线程调度上的开销就越大
3、程序设计变得更加复杂
讲完了多线程的理论知识,下面就得开始讲讲怎么实现了
一般来说,多线程的技术方案有四种:
1、pthread (知道就行)我们需要管理线程的生命周期
2、NSThread (知道就行)我们需要管理线程的生命周期
3、GCD 我们不需要管理线程的生命周期
4、NSOperation 我们不需要管理线程的生命周期
我经常使用的是GCD,下面来说一下GCD(一定要自己主动去说,不要等面试官来问,自己说的话就掌握了主动权,但是一定要知道说什么)
GCD的使用
使用GCD只需要记住关键一点就是把任务放到队列中。
而我们有两种方式来把任务放到队列中。
1、同步方式 在当前线程中把任务放到队列中
2、异步方式 开启新的线程把任务放到队列中
队列
并发队列:让多个任务同时进行
同步并发队列: 因为同步不会开启新的线程,即使是并发队列,任务也不能够同时进行(效果和同步串行效果一致),所以我们一般不会这么用
异步并发队列: 开启多个线程,任务同时进行
串行队列:让任务一个接着一个的执行
同步串行队列:在当前线程中 (不开启线程),任务按顺序依次执行
异步串行队列:开启新的线程 (仅开一个线程,为保证任务是按顺序执行),任务按顺序执行
回答完这些内容应该就可以了,下面列出一些GCD的常用的内容
Barrier 阻塞
用于多个异步操作之后统一对非线程安全的对象进行处理
GCD 延时执行
单例
调度组
用于多个异步操作完成之后继续做某些事情
注意⚠️:在主线程上执行主队列的同步任务会产生死锁
关于这个问题有点绕,面试的时候记住就好啦
我这里讲的仅仅是多线程的基础,平时面试回答这些肯定够用,自己没事多练习几遍,面试的时候会更加自信!!
后面会继续更新其他面试问题,希望大家多多支持!!!