我有一个java程序,具有多线程。我的问题是,我有时会超时。 因为我有一些unix的东西,我看不到超时或/和锁定在哪里。问题在于,这不会每天晚上发生,只是不时发生。 实际上,一个unix组件(lsf)会终止线程(如果超过15分钟)。因为我看不出问题在哪里,所以我想知道是否有人有任何想法。 有没有机会启动另一个java的东西,当我有一个锁,写一个日志文件?如果,是的,会是什么?Java多线程 - 检测自动锁定线程
0
A
回答
3
jstack是一个命令行程序,您可以用它来反省正在运行的java程序。它会打印出每个线程的堆栈跟踪,告诉你它是否被锁定,甚至检测到死锁。这可以帮助您以交互方式调试问题。
如果你想在你的程序中获得这些数据,你可以拨打Thread.getAllStackTraces()这将得到你所有的线程和他们的堆栈跟踪列表,所以你可以看到线程在哪里和他们的状态,如果你想'做如果某个线程被锁定,就像写入日志文件一样。
4
1
除了jstack你可以检查出JConsole,这是一个GUI应用程序,允许您检测死锁,监视线程/内存/ CPU使用率,等它附带的JDK。
JConsole在内部使用ThreadMXBean
,您还可以使用它编程检测死锁;例如我通常安排在我的服务器应用程序以定期调用下面的代码守护线程:
private void detectDeadlocks() {
logger.info("Checking for deadlocks.");
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
long[] threadIds = threadMXBean.findDeadlockedThreads();
if (threadIds == null || threadIds.length == 0) {
logger.info("No deadlocks found.");
} else {
StringBuilder sb = new StringBuilder();
for (long threadId : threadIds) {
ThreadInfo threadInfo = threadMXBean.getThreadInfo(threadId);
if (sb.length() > 0) {
sb.append(", ");
}
sb.append(threadInfo.getThreadName()).append(" (ID: ").append(threadId).append(')');
}
logger.severe("Blocked Threads: " + sb);
// Raise alert here, etc.
}
}
相关问题
- 1. 多线程锁测试
- 2. Java线程锁
- 3. 多线程自旋锁?
- 4. 多线程锁定Java Swing GUI
- 5. 锁定多个线程
- 6. Java线程死锁
- 7. Java,线程死锁?
- 8. Java线程锁住
- 9. QMutex :: lock:线程中检测到死锁0xfe8(主线程?)
- 10. 多线程与锁vs单线程?
- 11. 多线程以及多进程的Java文件锁定方式
- 12. Java线程(多线程)
- 13. 线程在自定义线程上锁定python
- 14. 线程锁定CollectionViewSource
- 15. 3线程锁定
- 16. java编程和java单线程多线程问题(单线程与多线程)
- 17. 在C自制线程池的多线程死锁#
- 18. 死锁线程检查
- 19. ASP.NET线程 - 双重检查锁定
- 20. 检查线程已经锁定
- 21. 自定义线程池/多线程在春季启动休息
- 22. 死锁的线程java
- 23. 关于多线程的java多线程
- 24. java中有多线程的多线程
- 25. Java多线程
- 26. std ::线程检测主线程
- 27. 多线程中的死锁
- 28. 多线程,通用锁具
- 29. ç窗口多线程文件锁定
- 30. 在多线程中锁定对象
正如有人曾经写的,多线程编程是95%思维和5%编写代码。所以更好的重新思考所有可能的种族和死锁情况。 – Bozho 2010-01-28 15:24:09
这是一个现有的非常大的应用程序。不可能考虑所有情况。我到达时已经准备好了。 – 2010-01-28 15:33:16