繁体   English   中英

java中的多线程调试

[英]Multithreaded debugging in java

我有一个运行大约50 threads的程序。 我使用生产者消费者设计模式来在线程之间传递数据。 程序运行一段时间之后,有时会因为我用来在线程之间分配数据的BlockingQueue之一冻结,因此程序的主要分发部分在尝试向此BlockingQueue添加数据时会阻塞。 换句话说,其中一个线程由于某种原因停止,然后用于接收数据的blockingQueue变满。

如何以有效的方式进行调试? 我尝试用catch(Exception e)包围所有run()方法中的内容,但是没有抛出任何东西。 我用Java/IntelliJ开发。

任何想法,想法或一般准则?

使用记录器“调试它”。 我喜欢SLF4J

在每个关键操作之前和之后设置log.debug语句。 在每个方法的开头和结尾使用log.enteringlog.exiting调用。

当您“调试”时,您将运行应用程序并将记录器设置为非常低级别(FINEST),然后运行您的应用程序并观察日志记录语句以了解它何时失败以及失败时的状态。

由于您担心线程问题,请确保您的日志格式包含线程名称或编号。

一般准则?

我不知道这是否适用于您的情况,但一个非常重要的指导原则是永远不会以不同的顺序进行锁定。

一个例子:

线程1:

ResourceA.lock();
ResourceB.lock();
...
ResourceB.unlock();
ResourceA.unlock();

线程2:

ResourceB.lock();
ResourceA.lock();
...
ResourceA.unlock();
ResourceB.unlock();

现在,如果线程1时,它已经拥有被中断ResourceA但尚未ResourceB和线程2允许运行,线程2将ResourceB 然后线程1拥有ResourceA并等待ResourceB ,线程2拥有ResourceB并等待ResourceA ,因此您有一个死锁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM