因为以下的一些原因导致cpu不再执行当前的线程,转而执行另一个线程的代码

    • 线程的cpu时间片用完
    • 垃圾回收
    • 有更高优先级的线程需要运行
    • 线程自己调用了sleep、yield、wait、join、park、synchronized、lock等方法

    • 当Context Switch发生时,需要由操作系统保存当前线程的状态存储进线程控制块TCB中,并恢复另一个线程的状态,Java中对应的概念就是程序计数器(PC)、PC是线程私有的;

    • 状态包括程序计数器包括、虚拟机中每个栈帧的信息、如局部变量、操作数栈、返回地址等;
    • Context Switch频繁切换会影响性能,当线程数大于核心数,则会导致线程间的频繁切换;

      image.png

    题外话:

    • 单核单CPU,同一时刻只能执行一个进程中的一个线程
    • 多核单CPU,因为只有一个CPU,实际上进程只能并发,即CPU需要在进程间来回切换,而对于一个进程来说,CPU看到内部有多个线程,就可以将多个线程分配给多个核,所以线程可以并行。
    • 多CPU,因为有多个CPU,这样才可以实现进程的并行。
    • 多核CPU本质上还是只有一个CPU,每个时刻只能处理一个进程,如果该进程有多个线程,那么就可以发挥多核CPU的作用,同时处理多个线程。由于时间片轮转的作用,处理该进程的时间片用完之后就会去处理下一个进程,以达到并发的效果。

    综上,同一进程的不同线程是可以并行执行的,因为每个线程可以分配在一个物理核上,但是不可能让线程执行完,因为这相当于让一个进程执行完毕,所以整体思路是:进程时间片用完了CPU即切换到另一个进程,但每当切换到一个进程中的时候,进程中的线程则可以并行执行。