当前位置: 首页 > 科技观察

随笔:如何向女友解释为什么Java线程没有Running状态?

时间:2023-03-23 09:50:54 科技观察

在多线程操作系统中,一个进程通常包括多个线程,每个线程是CPU利用率的一个基本单位,是开销最少的实体。线程是有状态的,线程的状态定义在Thread.State枚举中,在JavaDoc中也有明确说明:通过查看源码和阅读JavaDoc,我们可以知道线程主要有以下六种states:NEW当一个线程被创建,但是还没有调用start()方法时,它处于NEW状态。RUNNABLE在Java虚拟机中执行的线程处于此状态BLOCKED等待锁的阻塞线程处于此状态。WAITING无限期等待另一个线程执行特定操作的线程处于此状态。进入该状态的线程需要等待其他线程采取一些特定的动作(通知或中断)。TIMED_WAITING一个线程在指定的等待时间内等待另一个线程执行某些操作时处于此状态。这个状态不同于WAITING,WAITING可以在指定的时间后自行返回。TERMINATED已退出的线程处于此状态。在给定的时间点,一个线程只能处于一种状态。但需要注意的是,这些状态代表的是虚拟机中线程的状态,而不是任何操作系统的线程状态。线程之间的状态可以相互转换,如下图所示:上图是线程的六种状态的转换图。当遇到不同的操作或事件时,线程的状态可能会发生变化。JavaDoc说在Java虚拟机中执行的线程处于RUNNABLE状态。但是在操作系统层面,一个线程要想被执行,就需要获得CPU的使用权。其实我们可以进一步细化RUNNABLE状态。根据线程是否已经获得CPU的使用权,可以分为两种:READY:线程对象创建后,其他线程(如主线程)调用该对象的start()。方法。该状态的线程位于runnable线程池中,等待被线程调度选中,分配cpu使用权。运行中(RUNNING):就绪(READY)的线程已经获得了cpu时间片,开始执行程序代码。也就是说,线程创建并执行start方法后,在没有获得CPU使用权时,处于就绪状态(READY)。当它获得CPU的使用权并开始执行时,就是运行状态(RUNNING)了。为什么未定义RUNNING状态?对于目前的分时操作系统来说,在单CPU的情况下,所有线程实际上都是串行执行的。但是为了让我们看起来像在并发执行,人们将CPU的执行分成许多小的时间片。无论哪个进程获得时间片,该线程都会执行。时间片用完后,必须释放CPU,然后重新竞争时间片。只要时间片划分的足够细,虽然多个程序是连续连续执行的,但看起来也是同时执行的。那么,CPU的时间片其实很短,一般在10-20毫秒左右。所以,也就是说,在一秒内,同一个线程可能一部分时间处于READY状态,一部分时间处于RUNNING状态。所以如果给线程明确定义了RUNNING状态,就会有一个很大的问题,就是这个状态其实是不准确的。因为当我们看到线程处于RUNNING状态时,很有可能他已经失去了CPU时间片。对于线程的状态,我们只需要知道它当前是否在“参与执行”即可。什么是“参与执行”?表示它的状态是可执行的,只要得到时间片就可以立即执行。这不是RUNNABLE吗?因此,Java并没有为线程定义RUNNING状态,而是定义了RUNNABLE状态。作者简介:漫画编程是一个以漫画+音频的形式讲解枯燥编程知识的公众号。致力于让编程变得更有趣。本文转载自微信公众号“漫花编程”,可通过以下二维码关注。转载本文请联系漫花编程公众号。