Ich habe gerade eingeschaltet von Oracle JDK 1.6, JDK 1.7.0_03 zu öffnen, und ich habe eine ziemlich bemerkenswerte Deadlock auf Ausfahrt getroffen:System.exit ist unter Linux nicht Thread-sicher?
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Thread.join(Thread.java:1258)
- locked <0x8608dda0> (a sun.awt.X11.XToolkit$1$1)
at java.lang.Thread.join(Thread.java:1332)
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 <0x8603df28> (a java.lang.Class for java.lang.Shutdown)
at java.lang.Runtime.exit(Runtime.java:107)
at java.lang.System.exit(System.java:960)
Es scheint, dass Sie System.exit aus der AWT nennen müssen Ereigniswarteschlange Ist das echt? Es gibt keine Dokumentation eines Threads Bedarf in den Sun docs Runtime.exit
ich andere überraschende Fälle getroffen haben, wo immer die AWT Baumsperre nur auf Linux erforderlich ist, aber dieses nimmt den Kuchen. Ist das ein Fehler oder habe ich gerade etwas in der Dokumentation verpasst?
eine SSCCE erhielt (http://sscce.org/) demonstriert die Sackgasse? – NPE
Die 'System.exit'-Methode erzwingt die Beendigung aller Threads in der Java Virtual Machine. Sie beheben das erwähnte Deadlock-Problem nicht, indem Sie System.exit verwenden, Sie beenden das Programm, bevor der Deadlock auftritt. Wenn Sie normal aufhören, werden Ihre anderen Threads ohne die Unterstützung des Hauptthreads fortgesetzt und anscheinend können sie es ohne es nicht tun. –