如何打印Java程序的线程栈信息
发表于:2025-11-15 作者:千家信息网编辑
千家信息网最后更新 2025年11月15日,这篇文章主要讲解了"如何打印Java程序的线程栈信息",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何打印Java程序的线程栈信息"吧!打印Java程
千家信息网最后更新 2025年11月15日如何打印Java程序的线程栈信息
这篇文章主要讲解了"如何打印Java程序的线程栈信息",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何打印Java程序的线程栈信息"吧!
打印Java程序的线程栈信息
jstack可以得知当前线程的运行情况
安装jstack等命令集,jstack是开发版本jdk的一部分,不是开发版的有可能找不到
yum install -y java-1.8.0-openjdk-devel
查看要打印堆栈的java进程ID
jps -l
打印堆栈
sudo -u admin jstack pid > jstack.txt
特别要注意的是jstack需要使用与进程一致的用户才能正确导出堆栈,否则会报错如下
Unable to open socket file: target process not responding or HotSpot VM not loaded
线程池异常堆栈的坑
import java.util.concurrent.*;public class DivTask implements Runnable{ int a,b; public DivTask(int a, int b) { this.a = a; this.b = b; } @Override public void run() { double re = a/b; System.out.println(re); } public static void main(String[] args) throws InterruptedException, ExecutionException {// ThreadPoolExecutor executor = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 0L, TimeUnit.SECONDS// , new SynchronousQueue<>()); TraceThreadPoolExecutor executor = new TraceThreadPoolExecutor(0, Integer.MAX_VALUE, 0L, TimeUnit.SECONDS , new SynchronousQueue<>()); //扩展TraceThreadPoolExecutor for (int i = 0; i < 5; i++) { // executor.submit(new DivTask(100,i)); //改进方式一: //Future re = executor.submit(new DivTask(100, i)); //re.get(); //改进方式二: executor.execute(new DivTask(100,i)); } //100.0 //25.0 //33.0 //50.0 //其中100/0的异常结果没打印 //线程池很有可能"吃掉程序抛出的异常 //改进方式一: //Exception in thread "main" java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero // at java.util.concurrent.FutureTask.report(FutureTask.java:122) // at java.util.concurrent.FutureTask.get(FutureTask.java:192) //。。。 //改进方式二: //Exception in thread "pool-1-thread-1" java.lang.ArithmeticException: / by zero // at com.Test.DivTask.run(DivTask.java:15) // at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) // at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) // at java.lang.Thread.run(Thread.java:748) //100.0 //33.0 //25.0 //50.0 //扩展TraceThreadPoolExecutor //java.lang.Exception: Client stack trace // at com.Test.TraceThreadPoolExecutor.clientTrace(TraceThreadPoolExecutor.java:20) // at com.Test.TraceThreadPoolExecutor.execute(TraceThreadPoolExecutor.java:12) // at com.Test.DivTask.main(DivTask.java:29) //Exception in thread "pool-1-thread-1" java.lang.ArithmeticException: / by zero // at com.Test.DivTask.run(DivTask.java:15) // at com.Test.TraceThreadPoolExecutor.lambda$wrap$0(TraceThreadPoolExecutor.java:25) // at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) // at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) // at java.lang.Thread.run(Thread.java:748) //100.0 //25.0 //33.0 //50.0 }}import java.util.concurrent.*;/** * 扩展TraceThreadPoolExecutor,让它在调度任务前先保存一下提交任务线程的堆栈信息 */public class TraceThreadPoolExecutor extends ThreadPoolExecutor { public TraceThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue) { super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); } @Override public void execute(Runnable task) { super.execute(wrap(task,clientTrace(),Thread.currentThread().getName())); } @Override public Future> submit(Runnable task) { return super.submit(wrap(task,clientTrace(),Thread.currentThread().getName())); } private Exception clientTrace(){ return new Exception("Client stack trace"); } private Runnable wrap(final Runnable task,final Exception clientTrace,String clientThreadName){ return () -> { try { task.run(); } catch (Exception e) { clientTrace.printStackTrace(); throw e; } }; }} 感谢各位的阅读,以上就是"如何打印Java程序的线程栈信息"的内容了,经过本文的学习后,相信大家对如何打印Java程序的线程栈信息这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
线程
信息
程序
堆栈
方式
学习
任务
内容
情况
进程
开发
一致
命令
就是
思路
文章
更多
版本
用户
知识
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
服务器怎么查僵尸
自学数据库可以吗
4c大学生网络技术比赛
数据库电子表格
危害网络安全怎么处罚
超市系统数据库设计
江西软件开发解决方案咨询
金牛区天沁网络技术
我的世界服务器管理员如何传人
中国网络安全公司最新排名
存储服务器故障处理
服务器收条
网络安全宣传稿子
套账处理工具链接数据库失败
nba2k21服务器关了
华为DP2200服务器参数
逃跑吧少年有多少服务器的
企顺计算机网络技术学费
搭建别人系统用自己的服务器
简述网络安全的概念解答题
什么是网络安全等级防护
u8安装以及数据库配置
全文数据库的论文范文
数据库粮仓系统
dell服务器热备
教职工管理系统数据库设计
信阳软件开发大概费用
数据库哈多普
国外软件开发要求
网络安全教育手抄报涂颜色