Install4j Util.showOptionDialog中可能存在死锁

Install4j Util.showOptionDialog中可能存在死锁,install4j,Install4j,参见install4j 6.0.4 安装程序的第一个屏幕显示一个选项对话框,询问用户是否希望在某些情况下继续,如果他们选择不继续,我们将调用installerContext.finish(-1) 在控制台模式下,如果用户输入Ctrl+C,则不会发生任何事情。如果在此之后输入“n”,安装程序将尝试退出,但会冻结 我得到了进程的jstack,我认为在安装程序上下文触发的系统.exit调用和正在等待输入完成的install4j shutdown钩子(CommandSink.waitForFinish)

参见install4j 6.0.4

安装程序的第一个屏幕显示一个选项对话框,询问用户是否希望在某些情况下继续,如果他们选择不继续,我们将调用
installerContext.finish(-1)

在控制台模式下,如果用户输入
Ctrl+C
,则不会发生任何事情。如果在此之后输入“n”,安装程序将尝试退出,但会冻结

我得到了进程的
jstack
,我认为在安装程序上下文触发的
系统.exit
调用和正在等待输入完成的install4j shutdown钩子(
CommandSink.waitForFinish
)之间存在某种死锁

“AWT-EventQueue-0”#13优先级=6 os_优先级=0 tid=0x00007fab7841c800 nid=0x110e等待监视器输入[0x00007fab5f521000]
java.lang.Thread.State:阻塞(在对象监视器上)
在java.lang.Shutdown.exit处(Shutdown.java:212)
-等待锁定(java.lang.Shutdown的java.lang.Class)
在java.lang.Runtime.exit(Runtime.java:109)
在java.lang.System.exit(System.java:971)处
位于com.install4j.runtime.installer.helper.InstallerUtil.exit(InstallerUtil.java:161)
位于com.install4j.runtime.installer.ContextImpl$6.run(ContextImpl.java:1191)
位于com.install4j.runtime.installer.ContextImpl.exit(ContextImpl.java:1195)
位于com.install4j.runtime.installer.InstallerContextImpl.exit(InstallerContextImpl.java:310)
位于com.install4j.runtime.installer.ContextImpl.finish(ContextImpl.java:865)
位于com.install4j.runtime.installer.InstallerContextImpl.finish(InstallerContextImpl.java:369)
位于com.acme.CustomCode.validate(MyCustomCode.java:64)
在com.install4j.script.I4jScript_Internal_8.eval(I4jScript_Internal_8.java:22)
在com.install4j.script.I4jScript_Internal_8.evaluate上(I4jScript_Internal_8.java:26)
位于com.install4j.runtime.installer.helper.Script.evaluate(Script.java:29)
位于com.install4j.runtime.installer.ContextImpl.runScript(ContextImpl.java:181)
位于com.install4j.runtime.installer.ContextImpl.runScript(ContextImpl.java:176)
位于com.install4j.runtime.installer.ContextImpl.runBooleanScript(ContextImpl.java:49)
位于com.install4j.runtime.installer.ContextImpl.runBooleanScript(ContextImpl.java:210)
位于com.install4j.runtime.installer.frontend.headless.AbstractHeadlessScreenExecutor.runValidationScript(AbstractHeadlessScreenExecutor.java:124)
位于com.install4j.runtime.installer.frontend.headless.ConsoleScreeneExecutor.handleScreen(ConsoleScreeneExecutor.java:56)
位于com.install4j.runtime.installer.frontend.headless.AbstractHeadlessScreenExecutor.execute(AbstractHeadlessScreenExecutor.java:81)
位于com.install4j.runtime.installer.controller.controller$1.run(controller.java:133)
在java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)中
位于java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
在java.awt.EventQueue.access$500(EventQueue.java:97)
在java.awt.EventQueue$3.run(EventQueue.java:709)
在java.awt.EventQueue$3.run(EventQueue.java:703)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
位于java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
位于java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
在java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)中
位于java.awt.EventDispatchThread.PumpeEventsforHierarchy(EventDispatchThread.java:105)
位于java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
位于java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
在java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
对象中的“SIGINT处理程序”#30守护进程优先级=9 os_优先级=0 tid=0x00007fab4c001000 nid=0x1128。等待()[0x00007FAB5F42200]
java.lang.Thread.State:正在等待(在对象监视器上)
在java.lang.Object.wait(本机方法)
-等待(com.install4j.runtime.installer.frontend.headless.AbstractHeadlessScreenExecutor$1)
位于java.lang.Thread.join(Thread.java:1245)
-锁定(com.install4j.runtime.installer.frontend.headless.AbstractHeadlessScreenExecutor$1)
位于java.lang.Thread.join(Thread.java:1319)
位于java.lang.ApplicationShutdownHooks.runHooks(ApplicationShutdownHooks.java:106)
位于java.lang.ApplicationShutdownHooks$1.run(ApplicationShutdownHooks.java:46)
位于java.lang.Shutdown.runHooks(Shutdown.java:123)
位于java.lang.Shutdown.sequence(Shutdown.java:167)
在java.lang.Shutdown.exit处(Shutdown.java:212)
-锁定(java.lang.Shutdown的java.lang.Class)
位于java.lang.Terminator$1.handle(Terminator.java:52)
在sun.misc.Signal$1.run处(Signal.java:212)
运行(Thread.java:745)
对象中的“关机挂钩”#12 prio=5 os_prio=0 tid=0x00007fab2c01c000 nid=0x112c.wait()[0x00007fab5d19c000]
java.lang.Thread.State:正在等待(在对象监视器上)
在java.lang.Object.wait(本机方法)
-等待(com.install4j.runtime.installer.controller.CommandSink)
在java.lang.Object.wait(Object.java:502)
位于com.install4j.runtime.installer.controller.CommandSink.waitForFinish(CommandSink.java:54)
-锁定(com.install4j.runtime.installer.controller.CommandSink)
位于com.install4j.runtime.installer.frontend.headless.AbstractHeadlessScreenExecutor$1.run(AbstractHeadlessScreenExecutor.java:60)

我可能有此问题的解决方案,请联系support@ej-technologies.com获得新版本。很抱歉,我花了这么长时间才回到这个问题,但我正在寻找一个可以测试升级的周期。经过测试,我发现死锁已经解决了。然而,我现在看到的是,发送
Ctrl+C
信号对安装程序没有任何即时影响。然而,几次屏幕后,它退出了。思想?实际上它完全被忽略了。我的instal
"AWT-EventQueue-0" #13 prio=6 os_prio=0 tid=0x00007fab7841c800 nid=0x110e waiting for monitor entry [0x00007fab5f521000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at java.lang.Shutdown.exit(Shutdown.java:212)
    - waiting to lock <0x00000000c2262a98> (a java.lang.Class for java.lang.Shutdown)
    at java.lang.Runtime.exit(Runtime.java:109)
    at java.lang.System.exit(System.java:971)
    at com.install4j.runtime.installer.helper.InstallerUtil.exit(InstallerUtil.java:161)
    at com.install4j.runtime.installer.ContextImpl$6.run(ContextImpl.java:1191)
    at com.install4j.runtime.installer.ContextImpl.exit(ContextImpl.java:1195)
    at com.install4j.runtime.installer.InstallerContextImpl.exit(InstallerContextImpl.java:310)
    at com.install4j.runtime.installer.ContextImpl.finish(ContextImpl.java:865)
    at com.install4j.runtime.installer.InstallerContextImpl.finish(InstallerContextImpl.java:369)
    at com.acme.CustomCode.validate(MyCustomCode.java:64)
    at com.install4j.script.I4jScript_Internal_8.eval(I4jScript_Internal_8.java:22)
    at com.install4j.script.I4jScript_Internal_8.evaluate(I4jScript_Internal_8.java:26)
    at com.install4j.runtime.installer.helper.Script.evaluate(Script.java:29)
    at com.install4j.runtime.installer.ContextImpl.runScript(ContextImpl.java:181)
    at com.install4j.runtime.installer.ContextImpl.runScript(ContextImpl.java:176)
    at com.install4j.runtime.installer.ContextImpl.runBooleanScript(ContextImpl.java:49)
    at com.install4j.runtime.installer.ContextImpl.runBooleanScript(ContextImpl.java:210)
    at com.install4j.runtime.installer.frontend.headless.AbstractHeadlessScreenExecutor.runValidationScript(AbstractHeadlessScreenExecutor.java:124)
    at com.install4j.runtime.installer.frontend.headless.ConsoleScreenExecutor.handleScreen(ConsoleScreenExecutor.java:56)
    at com.install4j.runtime.installer.frontend.headless.AbstractHeadlessScreenExecutor.execute(AbstractHeadlessScreenExecutor.java:81)
    at com.install4j.runtime.installer.controller.Controller$1.run(Controller.java:133)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)


"SIGINT handler" #30 daemon prio=9 os_prio=0 tid=0x00007fab4c001000 nid=0x1128 in Object.wait() [0x00007fab5f422000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00000000c3171798> (a com.install4j.runtime.installer.frontend.headless.AbstractHeadlessScreenExecutor$1)
    at java.lang.Thread.join(Thread.java:1245)
    - locked <0x00000000c3171798> (a com.install4j.runtime.installer.frontend.headless.AbstractHeadlessScreenExecutor$1)
    at java.lang.Thread.join(Thread.java:1319)
    at java.lang.ApplicationShutdownHooks.runHooks(ApplicationShutdownHooks.java:106)
    at java.lang.ApplicationShutdownHooks$1.run(ApplicationShutdownHooks.java:46)
    at java.lang.Shutdown.runHooks(Shutdown.java:123)
    at java.lang.Shutdown.sequence(Shutdown.java:167)
    at java.lang.Shutdown.exit(Shutdown.java:212)
    - locked <0x00000000c2262a98> (a java.lang.Class for java.lang.Shutdown)
    at java.lang.Terminator$1.handle(Terminator.java:52)
    at sun.misc.Signal$1.run(Signal.java:212)
    at java.lang.Thread.run(Thread.java:745)

"shutdown hook" #12 prio=5 os_prio=0 tid=0x00007fab2c01c000 nid=0x112c in Object.wait() [0x00007fab5d19c000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00000000ebb08610> (a com.install4j.runtime.installer.controller.CommandSink)
    at java.lang.Object.wait(Object.java:502)
    at com.install4j.runtime.installer.controller.CommandSink.waitForFinish(CommandSink.java:54)
    - locked <0x00000000ebb08610> (a com.install4j.runtime.installer.controller.CommandSink)
    at com.install4j.runtime.installer.frontend.headless.AbstractHeadlessScreenExecutor$1.run(AbstractHeadlessScreenExecutor.java:60)