Tôi vừa mới chuyển từ Oracle JDK 1.6, để mở JDK 1.7.0_03, và tôi đã trúng một bế tắc khá đáng chú ý xuất cảnh:System.exit không phải là luồng an toàn trên Linux?
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)
Có vẻ như bạn phải gọi System.exit từ AWT hàng đợi sự kiện. Điều này là thật? Không có tài liệu nào về yêu cầu luồng trong tài liệu Sun Runtime.exit
Tôi đã nhấn các trường hợp đáng ngạc nhiên khác khi yêu cầu khóa cây AWT chỉ được yêu cầu trên Linux, nhưng cái này lấy bánh. Đây có phải là một lỗi, hoặc có tôi chỉ bỏ lỡ một cái gì đó trong tài liệu?
Có một SSCCE (http://sscce.org/) chứng minh bế tắc? – NPE
Phương thức 'System.exit' buộc chấm dứt tất cả các luồng trong máy ảo Java. Bạn không sửa chữa vấn đề bế tắc được đề cập bằng cách sử dụng System.exit, bạn đang dừng chương trình trước khi bế tắc xảy ra. Khi bạn dừng lại bình thường, các chủ đề khác của bạn tiếp tục mà không cần sự hỗ trợ của sợi chính và dường như chúng không thể làm như vậy mà không có nó. –