Java 多线程如何实现在多 CPU 上分布?
如题
1 个回答
谎言不会伤人,真相才是快刀。华仔这个在网上应该有很多答案,很多公司技术面试可能会问到类似问题。(摘选内容源自网络) 关于 Java 多线程在 CPU 上分布的问题,首先要明白一点,它与 CPU 是多核还是双核并没有必然的联系。CPU 有时只能执行一个线程,这是因为在多线程并行执行时,CPU 可以根据一定的算法来调度和切换线程。一般而言对于多线程的理解可以是 CPU 根据一定的线程调度算法来切换线程,因此在相应时段,可看作是多个线程在并发执行。但在某一时间点上实际运行的只有一个线程。 在 Java 多线程中有并发编程和 CPU 时钟震荡两个关键的问题。我们都知道,在很久以前的 DOS 系统里,只能执行单任务。而我们现在使用的 Windows 都可以实现多任务操作,可以一边上网聊天、一边听歌、一边再下载电影等等。那么,操作系统是怎样支持多任务的?每打开一个程序,就意味着启动一个进程,并为其分配相应的内存空间,这样就可以让程序并发运行了。而 CPU 有时钟频率,即每秒可执行的 CPU 指令次数,在一个时钟周期内,CPU 实际上只能执行一条(或者多条指令)。 操作系统对进程线程进行管理,对每一个进程进行时间分配,然后在每个进程的内部,程序代码自己处理该进程内部线程的时间分配,多个线程相互之间要在很短的时间内进行切换。因此,给人的感觉是多个任务、多个线程是在并发运行的,但实际上,程序的运行还是异步的。 既然是异步运行的,那么则可以理解为 CPU 的运行方式是串行而非并行,那么我们称之为多线程有什么意义?原因还是 CPU 的运行速度太快了,但是我们 I/O 的读取速度,网络的传输、数据库的连接等等与 CPU 运算速度比起来,则是非常慢的。为了充分利用 CPU,就可以减少 CPU 的空闲时间。 多线程的目的在于最大限度的利用 CPU 资源,在 CPU 中,主频=外频×倍频,主频越高,一个时钟周期里面完成的指令数也越多,当然 cpu 的速度也就越快了,以前提高 CPU 运算速度的方法,就是提高 CPU 主频,可是随着时间的推移,CPU 的主频已经达到了物理极限,很难再提高了。于是为了解决这一问题,多核的 CPU 才开始逐渐受人青睐。 关于 Java 多线程有两个重要问题: 首先简单谈谈关于内存方面的问题,在 Java 中所有变量都储存在主存中,每条线程都有自己的工作内存(Working Memory),工作内存中存储的内容通常是主存中变量的复件。线程对所有变量的操作均在工作内存中进行,线程之间无法相互直接访问,变量传递也都需要在主存完成。线程之间的通信简单而快速,进程之间是相互独立的,如果不依赖网络,进程之间是无法通信的。 其次是关于线程调度的问题,CPU 对于各个线程的调度是随机的(分时调度),而在 Java 中,JVM 负责线程的调度,可更好地分配 CPU 的使用权。对于线程的调度一般有两种模式,分时调度和抢占式调度。分时调度是按照顺序平均分配;抢占调度是按照优先级来进行分配。 以上就是关于多线程在 CPU 上的分布问题的简单论述,从而帮助大家加深对多线程的理解。 转载 延伸阅读:https://blog.csdn.net/qq\_29824717/article/details/82561301 https://www.zhihu.com/question/64072646编辑于 2021-04-04 10:29 •IP属地 浙江举报评论收藏
公众号进入网站体验更佳

