【问题标题】:Java thread stopping for a whileJava 线程停止一段时间
【发布时间】:2020-07-31 21:18:28
【问题描述】:
我有以下问题。我有一个部署在 tomcat 服务器中的 Springboot Java 应用程序。我使用 SimpleAsyncTaskExecutor 和 @Scheduled 每 10 分钟运行一次任务。但有时执行会停止,并在一段时间后继续执行,有时 2 分钟,有时 10 分钟,有时它就不会继续执行。
我尝试增加 tomcat 的最大内存,但这没有用。我确定这不是一个未捕获的异常,所以我认为这可能是线程饥饿,但我该如何解决这个问题?
【问题讨论】:
标签:
java
multithreading
tomcat
concurrency
【解决方案2】:
如果是线程饥饿问题,那么您可以在方法声明中使用关键字synchronized,或者在有关键代码的地方创建synchronized{} 代码块。您也可以使用Lock 并使用Lock 提供的.lock() 和.unlock() 方法。
注意 - 如果您使用的是 Lock,请将您的关键代码放在 try{} finally 块中,以便您始终释放内在锁。
lock.lock(); //using lock
try {
//execute critical section of the code.
} finally {
lock.unlock();//release the lock so other thread can use it.
}
【解决方案3】:
可能会发生两件事:
- 您的线程正在等待监视器
- GC 正在进行 stop-the-world 收集。
您可以使用 -xloggc 开关将 GC 日志添加到您的应用程序。这样您就可以更好地了解堆。
您还可以在线程被锁定之前、之后和期间使用 jstack 或 kill -3 进行堆栈跟踪。您可以单独运行它并输出到文件。
您还可以将 jconsole 连接到您的应用程序并检查您的堆和线程