多线程做为面试的重灾区,若是咱们可以进行深刻的了解和使用,对咱们而言是很是有有益的,尤为是在面试的时候,若是多线程回答的好,是很是可以加分的。这样才可以经受住面试官的夺命连环问!java
无论学什么,咱们都须要有一个总体的认知,俯瞰其全貌,了解其细节,若是能够的话,最好是画一个思惟导图,将其中的分支和一个个的小的知识点,记录上去,方便咱们学习的时候,逐步有条理的分解性学习,从而达到从点到面,从面到体的过程。面试
多于多线程的学习,比较推荐的天然仍是本身动手作小实验和了解理论基础,咱们在时间充裕的状况下,能够看有关于多线程的书籍,好比(Java多线程编程核心技术、Java并发编程实战 (java并发的圣经)、多处理器编程的艺术)等等,可是对于时间不太充裕的同窗,看书和本身动手实践的时间就会比较少,这个时候咱们只能靠背、看面试题的方法去学习。算法
在以前的时候,小农有看到一个面试要求,小农看到了以为颇有意思,就记录下来了,是什么呢?数据库
- Java基础扎实,熟悉JVM、多线程、集合等基础,熟悉分布式、缓存、消息、搜索等机制
- 三年以上Java开发经验,熟悉Spring、MyBatis等框架
- 对于压榨CPU性能有浓厚兴趣!
- 具备必定项目规划和决策能力,善于捕捉业务需求、系统架构设计中存在的问题,并给出有效的解决方案
- 具备高度领域设计能力和业务分析能力,能独立分析和解决问题
咱们看到第三条,对CPU性能压榨有浓厚的兴趣,线程的历史,就是对电脑CPU压榨的一个历史,当咱们的多线程越多效率越高,对于CPU的压榨也就越厉害,可是压榨的时候咱们也须要注意,在压榨的同时,保证程序的正常运行也是咱们须要考虑的一个点。编程
对于线程的历史,其实就是对于服务器的CPU进行不断的利用的升级过程。当咱们学习一个新技术的时候,去了解这个技术的背景,能够更好的了解和掌握新技术,虽然这个过程看起来无用且浪费时间,可是在咱们后面的学习过程,可以帮助咱们更好的理解新技术。从线程的发展来看,能够分为五个阶段:缓存
最先的就是单进程进行人工切换,那个时候的程序,一次就只能运行一个程序,当咱们想要切换别的程序的时候,只能人工中止当前程序,再来运行别的程序,这个时候CPU利用率不高,不少时候是等着人工来进行干预,以下图所示:服务器
慢慢的有人就以为这种方式太慢了,或者太影响效率了,因而就有了多进程批处理,能够理解为,在咱们进程里面,有ABCDF五个程序,咱们能够一次性输出这五个程序,不用再他们之间在进行切换,可是若是程序A阻塞了,那么其余四个程序就须要进行等待,以下图所示:markdown
把程序写在不一样的内存位置上来回切换,好比咱们有ABC三个程序,程序A去CPU进行运算,可是因为网络的延迟或者什么缘由,致使程序A阻塞了,那么这个时候程序B就能够去CPU里面去执行,若是程序B也阻塞了,那么程序C就能够去CPU里面执行网络
程序内部能够有不一样的任务进行来回的线程切换,好比说咱们使用的IDEA,它内部可能有的在等待网络的传输,有的在进行代码的展现,有的在进行save,将咱们的代码保存在历史记录等等,这些个任务他们执行的时候也是并行的执行的,这个时候就产生了线程的概念,线程是属于一个进程里面并行执行的这样的不一样的路线,一个程序不一样任务的切换,一个线程若是要提高他的效率的,内部实际上是很是复杂的。其中设计到网络和IO的知识。多线程
是一种最轻量化的线程,一种绿色的线程,它也是一种用户线程,就是有用户本身管理,再也不由计算机去管理, 让应用程序能够独立决定本身的线程要如何运做。操做系统内核不能看见它,也不会为它进行调度,纤程有本身的寻址空间。应用程序能够在一个线程环境中建立多个纤程,而后手动运行它。纤程不会被自动运行,必需要由应用程序自已指定让它运行,或换到下一个纤程。
进程就是说在系统中正在运行的应用程序,程序一旦运行就是进程,好比咱们经常使用的QQ,WeChat等等,进程是系统进行资源分配的独立实体,每一个进程都有本身独立的地址空间,一个进程能够有多个线程,每一个线程使用本身所属进程的栈空间。
// 进程:是操做系统资源分配的基本单位,好比内存、打开文件、网络IO,分配了独立的内存空间
public class T00_Process {
public static void main(String[] args) {
System.out.println("hello world");
}
}
复制代码
线程是程序执行的最小单位,它被包含在进程之中,是进程中的实际运做单位。一条线程指的是一个单一顺序的控制流,一个进程中能够并发多个线程,每条线程并行执行不一样的任务,一般也被称为轻量进程。
单线程:
单线程下,不一样的执行路径
多线程:
纤程(Fiber)包含独立的目态栈,寄存器状态的控制信息,目态控制的纤程转接要求较高的编程经验,因为纤程属于目态对象,一个纤程被封锁意味着所在线程被封锁,应用程序能够经过ConvertThreadToFiber将线程转换为纤程,与线程对比,纤程具备切换速度快的特色。
纤程具备的特征
什么是线程的上下文切换?: 多线程的上下文切换是指 CPU 控制权由一个已经正在运行的线程切换到另一个就绪并等待获取 CPU 执行权的线程的过程。
一般一个任务不光 cpu 上要花时间, io 上也要花时间(例如去数据库查数据,去抓网页,读写文件等)。 一个进程在等 io 的时候, cpu 是闲置的,另外一个进程正好能够利用 cpu 进行计算。 多几个进程一块儿跑,能够把 io 和 cpu 都跑满了。 如今通常都是虚拟资源,资源有弹缩机制,因此通常该跑多线程的时候就能够跑多线程。
固然不是,线程的切换也是须要消耗资源的,越多意味着线程来回之间的切换。
我是牧小农,怕什么真理无穷进一步有进一步的欢喜,你们加油