Java 批处理由于在 java.lang.System.exit(int) 处被阻止而永远无法完成

标签 java mysql

我有一个 Java 批处理,它永远不会完成。它在代码末尾调用 System.exit() ,但根据线程转储,由于某种原因它被阻塞在 Shutdown.halt0() 处,并且批处理永远不会完成。造成这种情况的原因是什么?

它使用 mysql-connector-java 5.1.38,我还看到一个线程被阻塞在 AbandonedConnectionCleanupThread.run() 但我不确定它是否与这个问题有关.

Java版本:

$ java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)

线程转储:

Attaching to process ID 7229, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.144-b01
Deadlock Detection:

No deadlocks found.

Thread 7244: (state = BLOCKED)
 - java.lang.Object.wait(long) @bci=0 (Interpreted frame)
 - java.lang.ref.ReferenceQueue.remove(long) @bci=59, line=143 (Compiled frame)
 - com.mysql.jdbc.AbandonedConnectionCleanupThread.run() @bci=16, line=43 (Interpreted frame)

Locked ownable synchronizers:
    - None

Thread 7238: (state = BLOCKED)

Locked ownable synchronizers:
    - None

Thread 7237: (state = BLOCKED)
 - java.lang.Object.wait(long) @bci=0 (Interpreted frame)
 - java.lang.ref.ReferenceQueue.remove(long) @bci=59, line=143 (Interpreted frame)
 - java.lang.ref.ReferenceQueue.remove() @bci=2, line=164 (Interpreted frame)
 - java.lang.ref.Finalizer$FinalizerThread.run() @bci=36, line=209 (Interpreted frame)

Locked ownable synchronizers:
    - None

Thread 7236: (state = BLOCKED)
 - java.lang.Object.wait(long) @bci=0 (Interpreted frame)
 - java.lang.Object.wait() @bci=2, line=502 (Interpreted frame)
 - java.lang.ref.Reference.tryHandlePending(boolean) @bci=54, line=191 (Interpreted frame)
 - java.lang.ref.Reference$ReferenceHandler.run() @bci=1, line=153 (Interpreted frame)

Locked ownable synchronizers:
    - None

Thread 7230: (state = BLOCKED)
 - java.lang.Shutdown.halt0(int) @bci=0 (Interpreted frame)
 - java.lang.Shutdown.halt(int) @bci=7, line=139 (Interpreted frame)
 - java.lang.Shutdown.exit(int) @bci=99, line=213 (Interpreted frame)
 - java.lang.Runtime.exit(int) @bci=14, line=109 (Interpreted frame)
 - java.lang.System.exit(int) @bci=4, line=971 (Interpreted frame)
 - com.example.xxx.main(java.lang.String[]) @bci=140, line=71 (Interpreted frame)

Locked ownable synchronizers:
    - None

最佳答案

添加选项DONT_FAKE_MONOTONIC=1解决了问题。

我的应用程序中使用了一个名为“libfaketime”的 native 库,该选项似乎是一种解决方法。详情:https://github.com/wolfcw/libfaketime/issues/109

关于Java 批处理由于在 java.lang.System.exit(int) 处被阻止而永远无法完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53293922/

相关文章:

Java SWT : Getting original X/Y Coordinates from Scaled Image

java - 在Spring JDBC中,如何在语句上设置RESULT SET HOLDABILITY?

java - Selenium 获取元素的自然高度和宽度。不应依赖样式属性。 GetSize()、GetLocation() 和 getRect() 无法这样做

php - 如何在 MySQL 中连接多个表,然后使用 PHP 将它们显示为每个新父 ID 的一组表

mysql - 在mysql中使用子查询

java - 我怎样才能在java中转换这个xml文档?

java - Java 两点之间角度的数学计算

mySQL "greatest"有两列可以为空

mysql - 如何表减表=答案 PHP MYSQL

mysql - 优化主从插入语句