2009-05-19 216 views
3

有人可以告诉我如何在Java多线程应用程序中找出“有多少线程处于死锁状态”?找到死锁线程列表的方法是什么?死锁线程检查

我听说过Thread Dump和Stack Traces,但我不知道如何实现它。

  • 我也想知道在Java 5中为线程引入了哪些新功能?

请让我知道您的意见和建议。

+0

事实证明,这几乎是http://stackoverflow.com/questions/217113/deadlock-in-java的重复。 – 2009-05-19 17:15:36

回答

7

获得线程转储方式:

  • CTRL- (Windows)或ctrl- \,可能在Linux/UNIX上使用ctrl-4和kill -3
  • jstack和您的进程ID(使用jps
  • 在J2SE 5.
  • jconsolevisualvm
  • 几乎任何调试

主要的新线程特性(释放2004年,在退出服务生命周期):

  • java.util.concurrent
  • 新的Java内存模型。
+0

非常感谢汤姆。 – 2009-05-19 18:41:17

2

使用kill -3的进程ID

这将打印到控制台的线程转储和线程争的概述

+0

谢谢!非常感谢。 – 2009-05-19 17:09:15

1

从你的程序内,则ThreadMXBean类有一个方法findMonitorDeadlockedThreads(),以及用于查询线程的当前堆栈跟踪方法。在Windows中的控制台中,通过Ctrl + Break向您提供堆栈跟踪列表并指示死锁的线程。除了对整理了一些并发“漏洞”的Java内存模型进行一些调整之外,Java 5中最重要的特性是它向程序员公开了比较和设置(CAS)操作。然后,在这个平台上提供了大量的并发实用程序。有真的东西一大堆,但它们包括:

  • 并发集合
  • 执行人,从而有效地让你实现的东西,如线程池
  • 其他常见的并发结构(队列,锁存器,安全栅)
  • 原子变量

您可能感兴趣的一些教程,我已经写了很多的Java 5 concurrency features的。

0

如果您想了解Java 5中的新并发功能,您可能会比获得Brian Goetz(Brian Goetz和许多设计Java 5并发库的共同作者)的副本Java Concurrency in Practice差很多。它既具有高度的可读性和权威性,又结合了实例和理论。

executive summary of the new concurrent utilities如下:

  • 任务调度框架 - 执行人框架是用于标准化调用,调度,执行,以及根据一组执行策略的异步任务控制的框架。提供的实现允许任务在提交线程,单个后台线程(如Swing中的事件),新创建的线程或线程池中执行,开发人员可以创建支持任意执行策略的Executor。内置的实施提供了可配置的策略,如队列长度限制和饱和策略,可以通过防止资源消耗失控来提高应用程序的稳定性。
  • 并发集合 - 添加了几个新集合类,包括新的Queue和BlockingQueue接口,以及Map,List和Queue的高性能并发实现。
  • 原子变量 - 原子操作单个变量(原始类型或引用)的类,提供高性能的原子算术和比较 - 设置方法。 java.util.concurrent.atomic中的原子变量实现提供比使用同步(在大多数平台上)可用的更高的性能,使它们对实现高性能并发算法以及方便地实现计数器和序列号生成器很有用。
  • 同步器 - 通用同步类,包括信号量,互斥量,屏障,锁存器和交换器,它们有助于线程之间的协调。
  • 锁定 - 虽然通过synchronized关键字将锁定内置到Java语言中,但内置监视器锁定存在许多不便之处。 java.util.concurrent.locks包提供了一个高性能的锁定实现,它具有与同步相同的内存语义,但它也支持在尝试获取锁时指定超时,每个锁具有多个条件变量,非词汇范围锁定,并支持中断正在等待获取锁定的线程。
  • 纳秒粒度计时 - System.nanoTime方法允许访问纳秒级粒度时间源以进行相对时间测量以及接受超时的方法(例如BlockingQueue.offer,BlockingQueue.poll,Lock.tryLock,Condition .await和Thread.sleep)可以在纳秒内取得超时值。 System.nanoTime的实际精度取决于平台。
+0

这是如何回答问题的? – 2013-02-20 18:46:42