有人可以告诉我如何在Java多线程应用程序中找出“有多少线程处于死锁状态”?找出死锁线程列表的方法是什么?
我听说过Thread Dump和Stack Traces,但我不知道如何实现它。
请告诉我您的意见和建议。
4 个答案:
答案 0 :(得分:7)
获取线程转储的方法:
- ctrl-break(Windows)或ctrl- \,可能是Linux / UNIX上的ctrl-4和
kill -3
-
jstack
和您的流程ID(使用jps
)
-
jconsole
或visualvm
- 几乎所有调试器
J2SE 5.0中的主要新线程功能(2004年发布,在服务终止期限内):
-
java.util.concurrent
- 新Java内存模型。
答案 1 :(得分:2)
在进程ID上使用kill -3
这将向控制台打印一个线程转储和一个线程争用概述
答案 2 :(得分:1)
在你的程序中,ThreadMXBean类有一个方法 findMonitorDeadlockedThreads(),以及查询当前线程堆栈跟踪的方法。在Windows中的控制台中,执行Ctrl + Break会为您提供堆栈跟踪列表并指示死锁线程。
除了对Java内存模型进行一些调整以整理一些并发“漏洞”之外,Java 5中最重要的特性是它向程序员公开了比较和设置(CAS)操作。然后,在此背后,平台中提供了大量的并发实用程序。实际上有很多东西,但它们包括:
- 并发收藏
- 执行器,它有效地允许您实现诸如线程池之类的东西
- 其他常见的并发结构(队列,锁存器,障碍)
- 原子变量
您可能对我在许多Java 5 concurrency features上撰写的一些教程感兴趣。
答案 3 :(得分:0)
如果你想了解Java 5中新的并发功能,你可能比得到Brian Goetz的Java Concurrency in Practice副本(Brian Goetz和许多设计Java 5并发库的共同作者)要糟糕得多)。它既具有高度的可读性和权威性,又结合了实际的例子和理论。
executive summary of the new concurrent utilities如下:
- 任务调度框架 - Executor框架是一个框架,用于根据一组执行策略标准化异步任务的调用,调度,执行和控制。提供的实现允许在提交线程内,在单个后台线程(如Swing中的事件),新创建的线程或线程池中执行任务,并且开发人员可以创建支持任意执行策略的Executor。内置实现提供可配置的策略,例如队列长度限制和饱和策略,可以通过防止资源消耗失控来提高应用程序的稳定性。
- 并发集合 - 添加了几个新的集合类,包括新的Queue和BlockingQueue接口,以及Map,List和Queue的高性能并发实现。
- 原子变量 - 用于原子操作单个变量(基本类型或引用)的类,提供高性能原子算法和比较和设置方法。 java.util.concurrent.atomic中的原子变量实现提供了比使用同步(在大多数平台上)更高的性能,使它们可用于实现高性能并发算法以及方便地实现计数器和序列号生成器。 / LI>
- 同步器 - 通用同步类,包括信号量,互斥锁,屏障,锁存器和交换器,它们有助于线程之间的协调。
- 锁定 - 虽然通过synchronized关键字将锁定内置到Java语言中,但内置监视器锁定存在许多不方便的限制。 java.util.concurrent.locks包提供了一个高性能的锁实现,它具有与同步相同的内存语义,但是它还支持在尝试获取锁时指定超时,每个锁具有多个条件变量,非词法范围的锁,并支持中断正在等待获取锁的线程。
- 纳秒级粒度计时 - System.nanoTime方法允许访问纳秒级粒度时间源以进行相对时间测量,以及接受超时的方法(例如BlockingQueue.offer,BlockingQueue.poll,Lock.tryLock,Condition .await和Thread.sleep)可以以纳秒为单位获取超时值。 System.nanoTime的实际精度取决于平台。