linux java 线程状态_进程 / Linux 进程 / Java 线程 状态

进程 / Linux 进程 / Java 线程 状态

进程状态

0894b3e71ebc2dd436008d7fae7fb987.png

就绪状态(ready):等待被调度

运行状态(running)

阻塞状态(waiting):等待资源

应该注意以下内容:

只有就绪态和运行态可以相互转换,其它的都是单向转换。就绪状态的进程通过调度算法从而获得 CPU 时间,转为运行状态;而运行状态的进程,在分配给它的 CPU 时间片用完之后就会转为就绪状态,等待下一次调度。

阻塞状态是缺少需要的资源从而由运行状态转换而来,但是该资源不包括 CPU 时间,缺少 CPU 时间会从运行态转换为就绪态。

Linux 进程状态

5f577260d6f4d73e6779d02e5fe25c05.png

R running or runnable (on run queue) 正在执行或者可执行,此时进程位于执行队列中。

D uninterruptible sleep (usually I/O) 不可中断阻塞,通常为 IO 阻塞。

S interruptible sleep (waiting for an event to complete) 可中断阻塞,此时进程正在等待某个事件完成。

Z zombie (terminated but not reaped by its parent) 僵死,进程已经终止但是尚未被其父进程获取信息。

T stopped (either by a job control signal or because it is being traced) 结束,进程既可以被作业控制信号结束,也可能是正在被追踪。

Java 线程状态

130f401547764f991f8a977dd2aada91.png

新建(New)

创建后尚未启动。

可运行(Runnable)

可能正在运行,也可能正在等待 CPU 时间片。

包含了操作系统线程状态中的 Running 和 Ready。

阻塞(Blocked)

等待获取一个排它锁,如果其线程释放了锁就会结束此状态。

无限期等待(Waiting)

等待其它线程显式地唤醒,否则不会被分配 CPU 时间片。

进入方法

退出方法

没有设置 Timeout 参数的 Object.wait() 方法

Object.notify() / Object.notifyAll()

没有设置 Timeout 参数的 Thread.join() 方法

被调用的线程执行完毕

LockSupport.park() 方法

LockSupport.unpark(Thread)

限期等待(Timed Waiting)

无需等待其它线程显式地唤醒,在一定时间之后会被系统自动唤醒。

调用 Thread.sleep() 方法使线程进入限期等待状态时,常常用“使一个线程睡眠”进行描述。

调用 Object.wait() 方法使线程进入限期等待或者无限期等待时,常常用“挂起一个线程”进行描述。

睡眠和挂起是用来描述行为,而阻塞和等待用来描述状态。

阻塞和等待的区别在于,阻塞是被动的,它是在等待获取一个排它锁。而等待是主动的,通过调用 Thread.sleep() 和 Object.wait() 等方法进入。

进入方法

退出方法

Thread.sleep() 方法

时间结束

设置了 Timeout 参数的 Object.wait() 方法

时间结束 / Object.notify() / Object.notifyAll()

设置了 Timeout 参数的 Thread.join() 方法

时间结束 / 被调用的线程执行完毕

LockSupport.parkNanos() 方法

LockSupport.unpark(Thread)

LockSupport.parkUntil() 方法

LockSupport.unpark(Thread)

死亡(Terminated)

可以是线程结束任务之后自己结束,或者产生了异常而结束。

参考资料

### 正确设置 JAVA_HOME 和 PATH 环境变量 在 Linux 系统中,如果 Java 环境变量配置完成后仍然无法通过 `java` 或 `javac` 命令找到对应的可执行文件,则可能是由于环境变量未正确设置或生效引起的。以下是关于如何正确设置 `JAVA_HOME` 和 `PATH` 的说明: #### 设置 JAVA_HOME `JAVA_HOME` 是指向 JDK 安装目录的一个环境变量。为了确保其值被正确定义并传递给系统,可以按照以下方式操作: 1. 打开终端编辑器,进入用户的 `.bashrc` 文件或者全局 `/etc/profile` 文件。 2. 添加如下内容以定义 `JAVA_HOME` 并将其加入到系统的路径中: ```bash export JAVA_HOME=/path/to/your/jdk export PATH=$JAVA_HOME/bin:$PATH ``` 这里 `/path/to/your/jdk` 替换为实际的 JDK 安装路径[^1]。 #### 刷新环境变量 完成上述修改后,需刷新当前会话中的环境变量使其立即生效: ```bash source ~/.bashrc # 如果是在用户级别配置 # 或者 source /etc/profile # 如果是在系统级别配置 ``` #### 验证配置是否成功 可以通过运行以下命令来验证 `java` 和 `javac` 是否已被正确识别以及版本号是否正常显示: ```bash java -version # 查看 Java 版本信息 [^2] javac -version # 查看 javac 编译器版本信息 ``` 如果以上两步均返回预期的结果(如指定版本号),则表明配置已成功;反之可能仍存在问题需要排查。 #### 排查常见错误原因 即使完成了上述步骤但仍遇到问题时,可以从以下几个方面入手分析: - **确认 JDK 已经正确安装**:检查目标路径是否存在有效的 JDK 文件夹及其子组件。 - **重复定义冲突**:多个地方存在不同版本的 `JAVA_HOME` 导致覆盖混乱,建议统一管理单一入口点。 - **权限不足**:某些情况下因权限限制可能导致部分功能不可访问,请尝试切换至 root 用户重试。 - 使用 jps,jstack 等工具进一步诊断潜在问题所在 [^4]。 ```bash jps # 显示本地主机上所有 Java 进程 ID jstack <pid> # 获取特定 PID 对应进程内的线程转储数据 [^3] ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值