关于线程

关于线程,自己能说多少呢?

线程是什么?

线程是作为CPU调度的最小单位

表现在一个线程对应了一个程序计数器,程序计算器记录着CPU执行到了哪个指令了

一个段代码块,经过编译后,对应了一串指令,CPU执行过程就是取指令和执行指令, 过程中总要记录下一个该取哪个指令,这个指令的下标就是放在PC中。

对于普通的指令,执行完后PC加一,表示取下一条指令来执行
对于跳转指令,执行该指令的实质就是给PC赋值,这样,在取指令的时,就可以取到对应的指令, 最终实现指令跳转,而对于CPU来说,永远是取的PC中的指令来执行,可以说,CPU对于是否跳转 是无感知的。

一段代码块想要被执行,就必须以线程的形式交由给虚拟机,这样才有机会获得CPU执行的可能。

以CPU视角来看,只认识线程,故,只有将代码逻辑包裹在线程中才可得以执行。

对比进程?

进程是包含线程的,一个进程可以包含多个线程。 进程持有了一段内存空间,用来分配给线程使用,而我们指的堆,就是在进程内存空间中的, 供不同线程使用。 另外,系统中的一些权限也是以进程为单位分配的。

线程的状态

线程的状态有
刚创建好、可运行、阻塞、等待、超时等待、终止

其中,可运行状态的是对于虚拟机来说的,为什么没有区分为在ready和running,对于操作系统中的线程,是区分这两个状态的, 而对于JVM来说,却把这两个状态都归为runnable状态,表示虚拟机不关注线程是否正在被运行,JVM对于操作系统来说,它是将一个线程 交付给操作系统运行的,把JVM中的线程映射到操作系统中的线程。

一个线程中在执行中 serverSocket.accept()方法,被称为阻塞运行,这时候检查该线程的状态,发现它是 Runnable,对于想JVM来说 它就是在运行的,但在操作系统中,它就是在等待状态,它不会占据CPU。

对于Runnable,虚拟机认为这是可运行的线程,由操作系统调度运行,可能在等待某个资源,比如CPU、或IO