Java线程状态之谜:TIMED_WAITING是否意味着性能瓶颈?

第一章:Java线程TIMED_WAITING状态的初步认知

在Java多线程编程中,线程的状态转换是理解并发行为的关键。TIMED_WAITING 是线程生命周期中的一个重要状态,表示线程正在等待另一个线程执行特定操作,但仅等待指定的时间长度。当调用带有超时参数的方法时,线程会进入该状态,并在超时后自动恢复为 RUNNABLE 状态,无需其他线程显式唤醒。

触发TIMED_WAITING状态的常见方法

  • Thread.sleep(long millis):使当前线程暂停执行指定毫秒数
  • Object.wait(long timeout):使线程等待,直到被通知或超时
  • Thread.join(long millis):等待目标线程终止或超时
  • LockSupport.parkNanos(long nanos):阻塞当前线程指定纳秒数

代码示例:sleep方法引发的TIMED_WAITING


public class TimedWaitingDemo {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            try {
                // 线程睡眠3秒,进入TIMED_WAITING状态
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });

        thread.start();
        Thread.sleep(100); // 确保子线程已启动

        // 输出线程状态,预期为 TIMED_WAITING
        System.out.println("线程状态: " + thread.getState()); // 输出:TIMED_WAITING
    }
}

TIMED_WAITING与WAITING的区别

特征TIMED_WAITINGWAITING
是否需要超时参数是否
自动恢复超时后自动恢复需其他线程显式唤醒
典型方法sleep(), wait(long), join(long)wait(), join(), park()
graph LR A[Running] --> B[TIMED_WAITING] B -- 超时或中断 --> C[Runnable]

第二章:由Thread.sleep引发的TIMED_WAITING

2.1 sleep方法的工作机制与线程状态转换理论

Java中的`Thread.sleep()`方法使当前线程暂停执行指定时间,从而让出CPU资源给其他线程。调用该方法时,线程从**运行态(Running)** 转换为**阻塞态(Blocked/Waiting)**,但不会释放已持有的锁。
sleep方法的典型用法
try {
    Thread.sleep(1000); // 暂停1秒
} catch (InterruptedException e) {
    Thread.currentThread().interrupt();
}
该代码使当前线程休眠1000毫秒。若其他线程调用`interrupt()`,会抛出`InterruptedException`,并清除中断标志。
线程状态转换过程
  • 调用sleep()前:线程处于Runnable状态
  • sleep()执行中:进入TIMED_WAITING状态
  • 休眠结束或被中断:重新进入Runnable等待调度
此机制有助于控制线程执行节奏,避免忙等待,提升系统整体调度效率。

2.2 模拟定时任务中的sleep使用场景

在编写定时任务时,sleep 是常用的控制执行频率的手段。通过暂停线程,可以避免频繁轮询导致的资源浪费。
基本使用示例
package main

import (
    "fmt"
    "time"
)

func main() {
    for {
        fmt.Println("执行定时任务...")
        time.Sleep(5 * time.Second) // 每5秒执行一次
    }
}
上述代码中,time.Sleep(5 * time.Second) 使当前 goroutine 暂停5秒,实现周期性任务调度。参数为 time.Duration 类型,支持纳秒级精度。
常见应用场景
  • 轮询数据库变化
  • 定期调用外部API获取数据
  • 日志采集与上报

2.3 sleep期间的资源占用与调度行为分析

在操作系统中,进程调用 `sleep` 后会进入阻塞状态,释放CPU资源,由调度器将其移出运行队列。此期间进程不参与CPU时间片竞争,显著降低系统负载。
内核调度行为
睡眠中的进程被挂起,其状态标记为不可执行(TASK_INTERRUPTIBLE 或 TASK_UNINTERRUPTIBLE),直到定时器超时唤醒。
资源占用情况
  • CPU占用:接近零,因进程不执行指令
  • 内存占用:保持不变,栈和堆数据仍驻留
  • 文件描述符与锁:持续持有,可能影响并发资源访问

#include <unistd.h>
int main() {
    sleep(5);  // 进程主动让出CPU,持续5秒
    return 0;
}
上述代码调用 `sleep(5)` 后,进程将被放入等待队列,内核调度其他可运行任务,提升整体资源利用率。

2.4 不当使用sleep导致的性能隐患案例

在高并发系统中,不当使用 sleep 可能引发严重的性能瓶颈。常见误区是通过阻塞线程等待资源就绪,导致线程池耗尽或响应延迟上升。
典型问题场景
例如,在轮询数据库状态时使用固定间隔的 time.Sleep,不仅浪费 CPU 资源,还可能导致关键任务延迟处理。

for {
    status := queryStatus(taskID)
    if status == "done" {
        break
    }
    time.Sleep(100 * time.Millisecond) // 每100ms轮询一次
}
上述代码每 100 毫秒查询一次数据库,若同时有 1000 个任务,将产生高达 10,000 次/秒的无效请求。应改用事件通知机制替代被动等待。
优化方案对比
方案资源消耗响应延迟
固定 sleep 轮询高不可控
条件变量/Channel低毫秒级

2.5 优化建议:替代方案与最佳实践

避免阻塞式调用
在高并发场景下,阻塞式 I/O 易导致资源耗尽。推荐使用异步非阻塞模式提升吞吐量。
go func() {
    for event := range eventChan {
        processEvent(event)
    }
}()
该代码通过 goroutine 异步处理事件流,eventChan 为带缓冲通道,避免生产者阻塞,提升系统响应性。
缓存策略优化
合理利用本地缓存(如 sync.Map)或分布式缓存(Redis),减少重复计算与数据库压力。
  • 使用 LRU 策略管理内存缓存
  • 设置合理过期时间防止数据陈旧
  • 缓存穿透场景下采用布隆过滤器预检
连接池配置建议
参数建议值说明
MaxOpenConns10-50根据数据库负载调整
MaxIdleConns5-10避免频繁创建连接

第三章:Object.wait(long)导致的限时等待

3.1 wait(long)方法的同步与通信原理

在Java多线程编程中,wait(long timeout) 方法是实现线程间同步与通信的核心机制之一。该方法必须在同步块(synchronized)中调用,使当前线程释放对象锁并进入等待状态,直到被唤醒或超时。
方法签名与参数含义
public final void wait(long timeout) throws InterruptedException
- timeout:最大等待时间(毫秒)。若为0,表示无限等待; - 线程进入对象的等待队列,释放持有的监视器锁; - 超时或接收到 notify()/notifyAll() 信号后重新竞争锁。
典型使用模式
  • 确保在 synchronized 块中调用,防止非法监控器状态异常;
  • 常配合 while 循环检测条件,避免虚假唤醒;
  • 实现生产者-消费者模型中的阻塞等待。
状态转换流程
运行状态 → 持有锁 → 调用 wait → 释放锁 → 进入等待集 → 超时/被通知 → 重新竞争锁 → 就绪状态

3.2 生产者-消费者模型中的限时等待实践

在高并发场景下,生产者-消费者模型常需避免无限阻塞。限时等待机制通过设置超时时间,提升系统响应性与容错能力。
限时入队与出队操作
使用带超时的阻塞队列(如 Java 中的 BlockingQueue.offer() 和 poll())可实现安全的限时等待:

// 生产者限时提交
boolean success = queue.offer(item, 500, TimeUnit.MILLISECONDS);
if (!success) {
    // 超时处理:日志、降级或丢弃
}

// 消费者限时获取
String data = queue.poll(1000, TimeUnit.MILLISECONDS);
if (data != null) {
    process(data);
}
上述代码中,offer 在队列满时最多等待 500ms,poll 在空时等待 1s。超时返回 null 或 false,避免线程永久挂起。
适用场景对比
场景推荐超时值处理策略
实时交易100–300ms快速失败
后台任务1–5s重试或缓存

3.3 notify丢失与超时处理的常见问题

在并发编程中,notify丢失和等待超时是条件变量使用中的典型问题。当notify在wait之前触发,线程进入等待状态后将无法被唤醒,导致永久阻塞。
虚假唤醒与notify丢失
为避免notify丢失,应始终在循环中检查条件:
for !condition {
    cond.Wait()
}
该模式确保即使notify提前发送,线程也会在条件满足前持续等待,防止因信号丢失导致的死锁。
超时处理机制
使用带超时的等待可防止无限期阻塞:
if !cond.WaitWithTimeout(5 * time.Second) {
    // 超时处理逻辑
}
参数说明:WaitWithTimeout返回false表示超时,true表示被正常唤醒。建议结合重试机制与日志记录提升系统健壮性。

第四章:LockSupport.parkNanos等并发工具的等待行为

4.1 LockSupport的底层支持机制与parkNanos原理

LockSupport 是 Java 并发包中实现线程阻塞与唤醒的核心工具类,其底层依赖于 `Unsafe` 类提供的 native 方法进行系统级调度。
核心方法 park 与 unpark
`LockSupport.park()` 和 `unpark()` 分别用于阻塞和唤醒线程,基于操作系统级别的信号量机制实现,避免了传统 wait/notify 必须成对调用的限制。
parkNanos 的精确阻塞控制
LockSupport.parkNanos(1_000_000); // 阻塞当前线程约1毫秒
该方法使当前线程进入限时等待状态,参数为纳秒级时间阈值。JVM 会通过系统调用(如 Linux 的 futex)实现高精度休眠,适用于超时控制场景。
  • park 不响应中断,但可通过中断标志位判断外部中断请求
  • 每个线程拥有独立的“许可”(permit),unpark 相当于发放许可,park 则尝试获取

4.2 线程间协作中精确控制等待时间的实战应用

在高并发场景下,线程间协作常需对等待时间进行毫秒级甚至纳秒级控制,以避免资源争用或实现超时重试机制。
使用带超时的等待机制
Java 中 wait(long timeout) 和 LockSupport.parkNanos() 支持精确等待。以下示例展示如何安全地使用超时等待:

synchronized (lock) {
    long startTime = System.nanoTime();
    long waitTimeMs = 500;
    lock.wait(waitTimeMs); // 最多等待500ms
    long elapsed = (System.nanoTime() - startTime) / 1_000_000;
    System.out.println("实际等待: " + elapsed + " ms");
}
该代码通过记录起始时间验证实际等待时长,适用于需要响应延迟敏感的任务调度。
常见等待策略对比
方法精度适用场景
Thread.sleep()毫秒级简单延时
wait(timeout)毫秒+纳秒对象锁协作
Condition.awaitNanos()纳秒级高精度同步

4.3 CountDownLatch.await(timeout)的典型使用模式

超时等待的协作同步
在并发编程中,CountDownLatch.await(timeout) 常用于主线程等待一组子任务在限定时间内完成。若超时仍未完成,主线程可继续执行后续逻辑,避免无限阻塞。
  • 适用于对响应时间敏感的场景,如微服务批量调用
  • 结合 countDown() 实现多线程协作
  • 返回布尔值判断是否在超时前达成条件
CountDownLatch latch = new CountDownLatch(3);
ExecutorService executor = Executors.newFixedThreadPool(3);

for (int i = 0; i < 3; i++) {
    executor.submit(() -> {
        try {
            // 模拟任务执行
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        } finally {
            latch.countDown();
        }
    });
}

boolean completed = latch.await(5, TimeUnit.SECONDS);
if (completed) {
    System.out.println("所有任务在时限内完成");
} else {
    System.out.println("等待超时,部分任务未完成");
}
上述代码中,latch.await(5, TimeUnit.SECONDS) 阻塞最多5秒。若三个任务在此期间全部调用 countDown(),则返回 true;否则超时返回 false,保障系统及时响应。

4.4 ScheduledThreadPoolExecutor任务延迟执行的影响

延迟执行的基本机制

ScheduledThreadPoolExecutor通过调度队列管理延迟任务,任务在指定延迟时间后由工作线程执行。延迟精度受系统时钟和线程池负载影响。

延迟对任务调度的影响
  • 高负载下,任务实际执行时间可能晚于预期
  • 频繁的短间隔调度可能导致线程竞争和资源浪费
  • 长时间运行的任务会阻塞后续延迟任务的执行
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
scheduler.schedule(() -> {
    System.out.println("Task executed after 5 seconds");
}, 5, TimeUnit.SECONDS);

上述代码创建一个包含两个线程的调度池,延迟5秒执行任务。若线程正忙于其他任务,该操作将排队等待,导致实际延迟超过5秒。

性能调优建议
合理设置核心线程数与任务延迟周期,避免过度调度,提升整体响应效率。

第五章:TIMED_WAITING是否意味着性能瓶颈的终极判断

在Java应用性能调优中,线程状态中的 TIMED_WAITING 常被误读为性能瓶颈的直接证据。然而,该状态仅表示线程在指定时间内等待资源或条件,并不必然反映系统负载异常。
常见触发场景分析
  • Thread.sleep(long) 主动休眠
  • Object.wait(timeout) 条件等待超时控制
  • LockSupport.parkNanos() 精确阻塞调度
  • 线程池中空闲线程等待新任务(如 ThreadPoolExecutor 的核心线程)
诊断工具与方法
通过 jstack 或 APM 工具采集线程栈,识别处于 TIMED_WAITING 的线程是否集中在特定组件。例如:

// 示例:健康线程池中的空闲线程
"pool-1-thread-1" #10 prio=5 os_prio=0 tid=0x00007f8a8c0b3000 nid=0x1a23 in Object.wait()
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:756)
关键区分指标
指标正常表现潜在问题
CPU使用率适中或偏低持续高位伴随大量TIMED_WAITING
线程数增长趋势稳定快速膨胀且无法回收
响应延迟符合预期显著升高
[线程采样流程] 输入 jstack PID → 过滤 TIMED_WAITING → 分析类名与调用栈 → 匹配业务逻辑(如定时任务、缓存刷新)→ 判断是否合理阻塞
告别手动改Hex!用Vector HexView命令行5分钟搞定固件数据“乾坤大挪移” 本文详细介绍了如何利用Vector HexView命令行工具快速实现嵌入式固件数据的自动化迁移,告别手动修改Hex文件的繁琐流程。通过实战案例和脚本示例,展示了如何5分钟内完成数据地址范围的重新映射,提升嵌入式开发效率,特别适用于烧录文件的内存布局调整。 阅读详情

相关推荐

11.15 分析finrl 的框架

11.15 分析finrl 的框架

yueguoqing88的博客 1083

载体线程性能瓶颈难排查?(一线专家总结的9项必看监控指标)

轻松定位载体线程性能瓶颈,一线专家总结9项关键监控指标。涵盖CPU占用、内存泄漏、上下文切换等核心维度,适用于高并发、分布式系统场景,帮助快速诊断线程阻塞与资源争用问题。掌握这些指标,提升系统稳定性与响应效率,值得收藏。

FuncLens的博客 607

NPP/VIIRS夜间灯光数据:从下载到应用的完整指南

本文提供了NPP/VIIRS夜间灯光数据从下载、处理到应用的完整实战指南。详细介绍了如何从官方源获取数据、解读文件结构、进行坐标校正与数据清洗,并深入探讨了其在城市扩张监测、社会经济指标估算、重大事件影响评估等领域的核心应用。文章旨在帮助研究者与从业者快速掌握这一强大的空间数据,将其转化为研究中的实用工具。

gpu4optimizer的博客 862

Jstack线程状态BLOCKED/TIMED_WAITING/WAITING解释

一、线程5种状态 新建状态(New) 新创建了一个线程对象。 就绪状态(Runnable) 线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。 运行状态(Running) 就绪状态的线程获取了CPU,执行程序代码。 阻塞状态(Blocked) 阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才

xh 5万+

Visual Studio报错TRK0005找不到CL.exe?三步彻底解决环境变量问题

本文详细解析了Visual Studio报错TRK0005找不到CL.exe的根本原因,并提供了三步彻底解决环境变量问题的方案。从验证安装完整性到配置永久环境变量,再到注册表级修复,帮助开发者建立健壮的开发环境配置体系,确保编译链稳定运行。

weixin_30839881的博客 459

JAVA:Spring Boot 集成 Baidu UID-Generator ID 生成器

百度UID-Generator是一款高性能分布式ID生成器,支持600万QPS,提供Snowflake扩展版和Cache模式两种实现方式。文章详细介绍了如何在Spring Boot项目中集成该组件,包括Maven依赖配置、MySQL表结构初始化、Spring Boot数据源配置、WorkerId分配策略实现以及UID生成器的核心配置。该方案具有无中心依赖、ID单调递增、支持集群部署等特点,适用于订单号、用户ID等分布式场景。通过缓存模式(Cache-Buffer)可进一步提升性能,满足高并发业务需求。

木头 487

这不就是多线程ThreadPoolExecutor和阻塞队列吗

无处不在的线程,多线程,阻塞队列,并发 编程世界无新鲜事,看你翻墙翻得厉不厉害 场景:现在的软件开发迭代速度(一周一更新,甚至一天一发布)真是太快了,今天进行软件更新的时候,看到了有趣的现象,这不就是线程池,ThreadPoolExecutor,阻塞队列,任务(下载和安装)最好的案例嘛!经常看到很多博文在写多线程,并发,队列,却举不出现实生活的场景例子,都在背书吗(天下文章一大抄,看你...

董广明的博客 569

在 SAP BTP 中玩转工厂日历 Maintain Factory Calendars 实战指南

工厂日历是企业关键的时间主数据,基于国家假日历定义工作日与非工作日,广泛应用于生产计划、采购交期、财务结账等业务场景。SAP系统通过三类应用(维护节假日、假日历和工厂日历)实现分层配置。工厂日历作为顶层配置,支持工作日模式设定和例外规则添加。在多系统架构中,工厂日历可通过集成场景同步,确保数据一致性。应用支持创建、编辑和查看功能,包含有效期设置、例外规则管理和多语言文本维护。合理设置工厂日历对业务运营至关重要,需注意命名规范和有效期选择,避免历史数据问题。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 222

揭秘Java线程TIMED_WAITING状态:99%的开发者忽略的性能隐患

深入解析Java线程的TIMED_WAITING状态,揭示常见性能瓶颈及优化策略。涵盖sleep、wait等方法的应用场景与监控手段,帮助开发者精准识别线程阻塞问题,提升系统响应效率。值得收藏

VarPerch的博客 794

车辆重识别/再辨识数据集: Vehicle Re-ID Datasets Collection

车辆数据库 1.VERI-Wild: A Large Dataset and a New Method for Vehicle Re-Identification in the Wild (2019-CVPR) 数据库名称:VERI-Wild 论文:链接 数据库描述: 车辆图像由一个包含174个摄像机,拍摄范围覆盖超过200平方公里的市区CCTV系统拍摄。摄像机是24小时连续拍摄30天,其长时间的...

AI炼丹师 6854

线程为什么总是进入TIMED_WAITING?这4种情况你必须掌握

掌握线程TIMED_WAITING的原因,快速定位Java并发问题。详解sleep、wait、join和LockSupport阻塞等4种典型场景,帮助开发者准确识别线程状态成因,提升排查效率。理解底层机制,优化程序性能,值得收藏。

FastSolve的博客 881

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

java 线程的几种状态

java thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明: NEW状态是指线程刚创建, 尚未启动 RUNNABLE状态是线程正在正常运行中, 当然可能会有某种耗时计算/IO等待的操作/CPU时间片切换等, 这个状态下发生的等待一般是其他系统资源, 而不是锁, Sleep等 BLOCKED这个状态下, 是在多个线程有同步操...

tyrroo的博客 1035

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

线程状态分析

【转】 线程状态的种类 以前大家接触到的线程状态是:BLOCKED、WAITING、TIMED_WAITING、RUNABLE,今天我们换个说法来看,到底什么样的线程会出现这种状态。 1、线程状态为“waiting for monitor entry”: 含义:意味着它 在等待进入一个临界区 ,所以它在”Entry Set“队列中等待。 此时状态:BLOCKED 举例:java.lang.Thread.State: BLOCKED (on object monitor) 知识点:注意 “Entry Set”

jsxztshaohaibo的博客 6147

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【高并发系统优化必看】:TIMED_WAITING线程过多如何快速定位与解决

快速定位并解决高并发系统中线程TIMED_WAITING过多问题,深入剖析线程TIMED_WAITING的原因,涵盖线程池配置、阻塞点分析与JVM调优方法,提升系统响应速度与稳定性,值得收藏。

InitPulse的博客 730

java 栈 线程_Java性能分析之线程栈详解与性能分析

Java性能分析之线程栈详解Java性能分析迈不过去的一个关键点是线程栈,新的性能班级也讲到了JVM这一块,所以本篇文章对线程栈进行基础知识普及以及如何对线程栈进行性能分析。基本概念线程堆栈也称线程调用堆栈,是虚拟机中线程(包括锁)状态的一个瞬间状态的快照,即系统在某一个时刻所有线程的运行状态,包括每一个线程的调用堆栈,锁的持有情况。虽然不同的虚拟机打印出来的格式有些不同,但是线程堆栈的信息都包含...

weixin_33416318的博客 742

java 线程 是否运行_JAVA中线程的状态

NEW:至今尚未启动的线程的状态。RUNNABLE:可运行线程的线程状态。处于可运行状态的某一线程正在 Java 虚拟机中运行,但它可能正在等待操作系统中的其他资源,比如处理器。BLOCKED:受阻塞并且正在等待监视器锁的某一线程的线程状态。处于受阻塞状态的某一线程正在等待监视器锁,以便进入一个同步的块/方法,或者在调用 Object.wait()之后再次进入同步的块/方法。WAITING:处于等...

weixin_39830175的博客 249

java线程有哪些状态_java 线程的几种状态

java thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明:NEW状态是指线程刚创建, 尚未启动RUNNABLE状态是线程正在正常运行中, 当然可能会有某种耗时计算/IO等待的操作/CPU时间片切换等, 这个状态下发生的等待一般是其他系统资源, 而不是锁, Sleep等BLOCKED这个状态下, 是在多个线程有同步操作的场景,比如正在等...

weixin_28884741的博客 153

JAVA基础面试题:Java中的线程状态与生命周期管理

Victor线程的6种状态状态转换逻辑:重点关注RUNNABLE与其他状态的转换条件。状态监控与优化:通过工具监控线程状态,优化系统性能。分布式系统中的应用:任务调度、故障排查和资源分配。Java中的线程状态与生命周期管理是并发编程的基础,深刻理解这些概念能够帮助开发者编写高效、稳定的多线程程序。无论是面试还是实际开发,这些知识点都至关重要。

qq_61302385的博客 582

再来捋捋Java 线程状态

在现代操作系统中,与是两个核心并发概念。是操作系统进行的基本单位;是CPU的基本单位。计算机发展初期,每个在CPU上运行的任务被抽象为。操作系统负责进程调度,并为每个进程分配独立的地址空间、文件句柄等系统资源。当CPU正在执行的进程时间片用完,操作系统会将其挂起,保存其上下文(如寄存器状态、内存映射等),然后调度另一个进程执行。然而,进程上下文切换涉及较多数据的保存与恢复,开销较大。为了提升并发效率,被引入。线程可视为进程内部的一个。

2501_93078354的博客 421

java线程有几种状态_java 线程的几种状态

java thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明:NEW状态是指线程刚创建, 尚未启动RUNNABLE状态是线程正在正常运行中, 当然可能会有某种耗时计算/IO等待的操作/CPU时间片切换等, 这个状态下发生的等待一般是其他系统资源, 而不是锁, Sleep等BLOCKED这个状态下, 是在多个线程有同步操作的场景, 比如...

weixin_39593593的博客 183

java线程状态研究

按照官方的说明java 的thread 有以下几种状态: NEW RUNNABLE BLOCKED WAITING TIMED_WAITING TERMINATED 会发现通过jstack 打印出来的线程状态不是这样的。 下面这个图是通过IBM 的jca 工具来分析jstack dump文件。顺便说一下jca 是目前发现最好的研究线程栈的工具,本地工具秒杀所有在线分析网站。可以从https://www.ibm.com/support/pages/ibm-thread-and-monitor-.

ykdsg的专栏 1294

JVM故障分析及性能优化系列之四:jstack生成的Thread Dump日志线程状态

转载 来源:爪哇堂 原文:https://www.javatang.com/archives/2017/10/25/36441958.html 作者: 前面文章中只分析了Thread Dump日志文件的结构,今天针对日志文件中 Java EE middleware, third party & custom application Threads 部分线程的状态进行详细的分析。 Threa...

a704397849的博客 536
上一篇: 【Java性能优化核心】:SurvivorRatio默认值如何影响Young GC效率?
下一篇: 如何用0.1%采样率实现精准监控?资深架构师亲授调优秘诀
QuickProceed
博客等级 码龄1年 149粉丝 2008原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值