最近重新学习了Java多线程的那部分,从而对多线程有了新的认识和疑问。
对于使用编程语言来说,往往是使用几个已经提供给你的API就行,虽然书上也有一大部分介绍了线程是个啥,但总体来说都是一种抽象概念,我想知道多线程的底层的具体是怎么实现的?
目前题主已知的知识:
进程和线程的区别
多线程是宏观上的并行,微观上依旧是串行
线程的生命周期
CPU的对每一个线程的资源分配是随机的(老师说的,和老师探讨了很久,感觉还是很不明白)
补充解释一下,我想知道的并不是细致到每一个电路都需要怎么实现,而是想明白当我们调用start()这个函数的时候,底层到底是发生了什么,系统是怎么做到宏观上的并行,微观上依旧是串行这样的呢?
希望各位能够解答我的问题啦或者给出相关资料,谢谢哒……
你貌似已经掌握了不少相关知识,只是还不太了解线程的底层实现(硬件和系统级)。
多线程之所以能够实现,第一是硬件的功劳,也就是CPU。现代的CPU有一个很重要的特性,就是时间片。每一段获得CPU的代码只能运行一个时间片规定的时间,例如10ms。到时间之后CPU就会把正在运行的代码暂停,然后发生一个中断。这个中断是系统级的事件,只有操作系统能够接手,这样控制权就落到了操作系统手里。
接下来就是操作系统的事情了。线程对操作系统来说就是一段代码+运行时数据(主要是寄存器数据,还有线程中与资源相关的数据,比如打开的文件等)。操作系统会为每个线程保存相关的这些数据,当接收到来自CPU的时间片中断事件时,就会按一定规则从这些线程中选择一个,恢复它的运行时数据,这样CPU就可以继续执行这个线程了。
选择一个合适的线程的过程称为线程调度,最简单的规则是FCFS,也就是按排队的时间先后顺序调度,谁先来排队,下一个就让谁运行。另外还有按优先级、按任务大小等调度策略,以及多种策略的组合等方式。详细的可以去了解一下操作系统的原理。
Java中线程实现主要依赖于操作系统,其本身不进行线程管理。它只是把线程相关的操作进行了封装和抽象,以方便我们使用。例如,Java中的线程可以设置优先级,但如果操作系统本身不支持优先级调度策略,那么为线程设置优先级是没有任何作用的。