我有一個Swing應用程序,它使用addShutdownHook()處理Ctrl + C,它可以正常工作,直到我有一個關閉任務調用一個正常情況下更改JLabel文本的關閉任務指出它掛起。檢測到JVM正在關閉
我認爲問題在於Swing EDT已終止或正在等待某事。
有沒有方法可以確定EDT已經終止或「已完成」(這樣我可以避免調用Swing方法),或防止Ctrl-C上通常關閉所有窗口的行爲?
只是爲了澄清:
我有一個名爲stop()
類中的方法。在正常情況下,可以調用這個函數(連同其補充start()
),並觸發導致JLabel更新的事件級聯,以獲得發生stop()
的視覺反饋。
當我的關機掛鉤運行時,我需要撥打stop()
正常關閉一些資源。
我在問的是如何檢測到Swing EDT不存在,因此我可以重寫stop()
,以便它檢測到Swing的缺失並避免調用Swing函數。
這將在一些時間工作。但是,它仍然取決於事件關閉的順序。由於您無法控制線程按什麼順序關閉,也無法按照什麼順序啓動關閉鉤子,導致鎖定的事件順序仍可能發生:(1)由於Ctrl + C,JVM開始關閉;(2) Swing線程被關閉,並且你的關閉鉤子還沒有被調用,(3)調用導致JLabel請求被改變的調用被稱爲 - 你的應用程序掛起(4)你的關閉鉤子被調用 - 但是爲時已晚防止無效/鎖定呼叫。 – jefflunt
@normalocity:不擔心,至少在這個問題的背景下。如果我發現序列(2),(3)如您所描述的那樣發生,那麼我需要處理一個單獨的問題,即使我沒有使用任何關閉掛鉤,也會發生這種情況。 –
好吧,無論哪種方式,我很高興你的代碼工作。畢竟,你是自己的代碼的工程師,所以如果你不擔心它,那麼我不能擔心它。提醒我你的其他問題:http://stackoverflow.com/questions/508850/java-concurrency-cynicism-gone-too-far我真的很喜歡併發代碼,所以我只是解決這些多線程問題的粉絲, 是全部。 – jefflunt