关于Runnable状态解释的疑惑
Topic source线程的状态只有这几种,并且被定义在State中:
https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/Thread.State.html
我看知乎上有个回答是下面这样说的:
运行态:RUNNABLE
在Java中,运行态包括就绪态 和 运行态。
-
就绪态
-
该状态下的线程已经获得执行所需的所有资源,只要CPU分配执行权就能运行。
-
所有就绪态的线程存放在就绪队列中。
-
运行态
-
获得CPU执行权,正在执行的线程。
-
由于一个CPU同一时刻只能执行一条线程,因此每个CPU每个时刻只有一条运行态的线程。
先就绪再运行,如果按照你说的不一定在运行。
一个CPU任意时刻当然只能运行一个线程,其他可以运行的线程都在等待操作系统分配CPU
你把这种状态的线程和等待锁的状态区分清楚就可以了,判断一个RUNNABLE状态的线程是不是正在被CPU执行其实没啥意义,因为高级应用程序并不能控制底层。
/** * Thread state for a runnable thread. A thread in the runnable * state is executing in the Java virtual machine but it may * be waiting for other resources from the operating system * such as processor. */RUNNABLE
没啥好纠结的,源码提供的解释就是"Thread state for a runnable thread. A thread in the runnable state is executing in the Java virtual machine but it may be waiting for other resources from the operating system such as processor(可运行线程的线程状态。 处于可运行状态的线程正在 Java 虚拟机中执行,但它可能正在等待来自操作系统的其他资源,例如处理器)".run里面的代码确实是在JVM中执行,但是JVM这个时候可能在等待处理器时间片.毕竟Java代码并不是直接由处理器执行的
在 Java 中,多线程中的阻塞状态和等待状态是两种不同的状态,它们之间有一些区别:
1. 阻塞状态(Blocked):
- 当线程在获取锁时被其他线程所占用,导致无法继续执行时,线程会进入阻塞状态。
- 线程进入阻塞状态是因为正在等待某个条件的发生,一旦条件满足,线程将会被唤醒并切换到就绪状态。
- 在阻塞状态下的线程仍然持有锁,只是无法继续执行而已。
2. 等待状态(Waiting):
- 当线程调用 `Object.wait()`、`Thread.join()` 或 `LockSupport.park()` 等方法进入等待状态时,线程会进入等待状态。
- 等待状态下的线程会释放持有的锁,等待其他线程调用 `notify()`、`notifyAll()` 或被中断时才能被唤醒。
- 等待状态通常用于线程间的协调和通信,等待特定条件满足后再继续执行。
总的来说,阻塞状态是因为线程被其他原因无法继续执行所产生的状态,而等待状态则是线程主动等待某些条件满足才能继续执行的状态。在编写多线程程序时,理解和正确处理线程的阻塞和等待状态是非常重要的。
手动挡和自动挡
- 1
阳光男孩blateyang
java核心技术卷一中指出线程调用start()方法后就处于Runnable状态,但并不一定就在运行。廖老师在博客中将Runnable状态解释为正在执行run方法的运行中的进程是否不妥?