首页 > 编程语言 >java的线程状态

java的线程状态

时间:2023-06-05 17:13:14浏览次数:37  
标签:状态 java pid 阻塞 线程 等待 CPU

 

New新创建
创建一个Thread对象,但还未调用start()启动线程时,线程处于初始态。

Runnable可运行
在Java中,可运行态包括:Ready 和 Running

Ready就绪态
该状态下的线程已经获得执行所需的所有资源,CPU只要分配执行权就能运行。
所有就绪态的线程存放在就绪队列中。
Running运行中
已获得CPU执行权,正在被CPU执行的线程。
由于一个CPU同一时刻只能执行一条线程,因此每个CPU每个时刻只有一条运行态的线程。
可以通过yield放弃CPU执行(例如在非抢占式操作系统中,需要由正在执行的线程主动放弃CPU)
Blocked被阻塞
注意是被动语态,当一条正在执行的线程请求某一资源失败时,就会进入阻塞态。

而在Java中,阻塞态专指请求锁失败时而被迫进入的状态。 (通常:锁、IO、Socket等都资源。但在这里仅涉及锁)
由一个阻塞队列存放所有阻塞态的线程。
处于阻塞态的线程会不断请求资源,一旦请求成功,就会进入Runnable-Ready就绪队列,等待执行。
Waiting等待中
当前线程中调用wait、join、park函数时,当前线程就会进入等待态。
也有一个等待队列存放所有等待态的线程。
线程处于等待态表示它需要等待其他线程的指示才能继续运行。需要由其他线程唤醒。
进入等待态的线程会释放CPU执行权,并释放资源(如:锁)
Timed wating计时等待
当运行中的线程调用sleep(time)、wait、join、parkNanos、parkUntil时,就会进入该状态;
它和等待态一样,并不是因为请求不到资源,而是主动进入。
进入该状态后释放CPU执行权 和 占有的资源。
与等待态的区别:到了设定时间后可自动进入Runnable-Ready
Terminated 被终止
包括运行结束自然终止,或者没有捕获异常而终止。

 

-----------------------------------------------------------------------------------------------------------

另外:

interrupt中断是一种机制,与这里的线程状态是不同层次的概念。

当对一个线程调用 interrupt 方法时,线程的中断状态将被置位。这是每一个线程都具有的 boolean 标志。每个线程都应该不时地检査这个标志(比如while循环), 以判断线程是否被中断。 但是, 如果线程被阻塞, 就无法检测中断状态。这是产生 InterruptedExceptioii 异常的地方。当在一个被阻塞的线程(调用 sleep 或 wait) 上调用 interrupt 方法时,阻塞调用将会被Interrupted Exception 异常中断。

获取pid

ps-ef|grep java

 

pid下的线程资源占用情况

top -Hp pid

将资源占用高这几个pid转为16进制

下载当前的java线程栈

查询16进制pid线程情况

 

java线程栈

 jstack -l pid>/1.txt

 

导出堆快照

jmap -dump:live,format=b,file=./heap.hprof pid

 

查看资源占用最大前30对象

jmap -histo pid | head -30

 

分析

通过MAT或者Jprofile或者jdk自带工具分析堆文件,寻找无法被回收的对象

标签:状态,java,pid,阻塞,线程,等待,CPU
From: https://www.cnblogs.com/lvgg/p/17458299.html

相关文章

  • java线上问题定位
    获取pidps-ef|grepjava pid下的线程资源占用情况top-Hppid将资源占用高这几个pid转为16进制下载当前的java线程栈查询16进制pid线程情况 java线程栈 jstack-lpid>/1.txt 导出堆快照jmap-dump:live,format=b,file=./heap.hprofpid 查看资源占用最大前30......
  • 1.2 Java基础 数据类型(Integer源码解析)
    Java数据类型和Integer源码解析1.2.1基本数据类型1.2.2什么是拆装箱1.2.3拆装箱是如何实现的1.2.4Integer继承关系1.2.5Integer源码解析1.2.1基本数据类型       如大家所知,Java是一门面向对象的语言,但是java并非完全面向对象,Java中的数据类型分为了       ......
  • 基础必会必考点 Java数组
    Java数组连续存储的元素集合<fontface="楷体">个人认为Java中的数据即C++、C语言相同,一定是连续分配的。笔者在C语言教材找到这样一段话可以证明:Allelementsofaone-dimensionalarrayarealwaysstoredinconsecutivememorylocations.数组定义非初始化:int[]a1;初始化:......
  • 4.3 Java Pipe管道详解
    4.3Pipe       Java管道Pipe是用于线程间通信的,但是需要注意的是,Java中的Pipe是用于一个虚拟机中的线程之间通信的,不能用于进程之间通信。Java管道和Unix/Linux中的管道Pipe的作用是不同的,Unix/Linux中的管道是用于进程之间通讯,是不同Process之间。而Java是同一个虚拟机......
  • 有限状态机
    有限状态机在计算机中是一份可以运动的代码。这份代码有有限个状态,里面的变量只能有有限个状态,比如://定义枚举类型,共9种状态typedefenum{ S1, S2, S3, S4, S5, S6, S7, S8, S9,}STATE;STATEcur_s=S1;//枚举类型的变量cur_s就只有有限个状态(9......
  • 42基于java的图书馆自习室座位预约系统
    本章节给大家带来一个基于java的座位预约系统,可以用于图书馆占位系统,图书馆座位预约系统,大学自习室占座系统,自习室座位预约系统,图书馆预约占座系统,自习室预约占座系统,座位预约系统等等;下面以图书馆为例,大家把源码下载下来后,还可以修改图书馆名字改成自习室或者阅览室占座系统都......
  • Java应用程序和小程序的区别是什么?
    最近正在B站上看动力节点老杜的视频自学Java,整理了这篇文章Java应用程序和小程序的区别,也是新手入门需要了解的,方便大家后续的学习 应用程序是一个独立的Java程序,在客户端或服务器端的虚拟机支持下运行。Java应用程序旨在执行特定功能,以在任何与Java兼容的虚拟机上运行,而不管计......
  • python爬虫爬取快手视频多线程下载功能【fd的使用】
    环境:python2.7+win10工具:fiddlerpostman安卓模拟器首先,打开fiddler,fiddler作为http/https抓包神器,这里就不多介绍。配置允许https 配置允许远程连接也就是打开http代理 电脑ip:192.168.1.110然后确保手机和电脑是在一个局域网下,可以通信。由于我这边没有安卓......
  • 两个变量交换的四种方法(Java)
     对于两种变量的交换,我发现四种方法,下面我用Java来演示一下。1.利用第三个变量交换数值,简单的方法。(代码演示一下)classTestEV2//创建一个类3{4publicstaticvoidmain(String[]args)5{6intx=5,y=10;//定义两个变量78......
  • 两个变量交换的四种方法(Java)
     对于两种变量的交换,我发现四种方法,下面我用Java来演示一下。1.利用第三个变量交换数值,简单的方法。(代码演示一下)classTestEV2//创建一个类3{4publicstaticvoidmain(String[]args)5{6intx=5,y=10;//定义两个变量78......