在我的應用程序中,我有一個ExecutorService
的固定大小1
。執行本機代碼的線程的優雅關閉
現在線程調用一些本地代碼。在本地方法內部,它被阻塞並等待需要分派的操作系統事件。問題在於ExecutorService
的正常關閉。
如果我中斷了線程,那麼線程仍然不出來(很明顯)。如果我將線程設置爲daemon
。它仍然不會讓JVM關閉。我唯一的工作代碼是使用System.exit
,這是我不打算使用的明顯原因。任何其他出路?
在我的應用程序中,我有一個ExecutorService
的固定大小1
。執行本機代碼的線程的優雅關閉
現在線程調用一些本地代碼。在本地方法內部,它被阻塞並等待需要分派的操作系統事件。問題在於ExecutorService
的正常關閉。
如果我中斷了線程,那麼線程仍然不出來(很明顯)。如果我將線程設置爲daemon
。它仍然不會讓JVM關閉。我唯一的工作代碼是使用System.exit
,這是我不打算使用的明顯原因。任何其他出路?
錯誤在於不返回的本地代碼。據我所知,通過更高級別的java來做到這一點的唯一方法是stop()
線程 - several reasons已棄用此線程。
要做到這一點,你需要重新設計使用老式的Thread
而不是ExecutorService
。你可能會這樣做,因爲尺寸固定爲1,因此ExecutorService
不會給你很多好處。據我看來,從您的問題看,如果您在stop()
之前沒有鎖定線程鎖,那麼您可能會使用stop()
。
編輯:
根據Apple's developer guide(第47頁),你可以指定一個EventTimeout
調用ReceiveNextEvent
時:
ReceiveNextEvent運行低級別事件循環,將事件作爲他們 發生到事件隊列。當發生指定的事件 ,或超過指定的超時時,函數返回。
OSStatus ReceiveNextEvent( UInt32 inNumTypes, const EventTypeSpec *inList, EventTimeout inTimeout, Boolean inPullEvent, EventRef *outEvent);
所以,如果我理解調用本機代碼就可以了你,當正確設置超時。
您是否認爲嘗試抓住並結束正常工作? – Madhu 2013-03-22 11:07:35
@Madhu如果它被困在本地代碼中,那麼你不能拋出異常(即嘗試/捕獲任何東西) - 這就是問題所在。 – ddmps 2013-03-22 11:12:32
什麼原生電話被阻止?你能人爲地滿足等待嗎? – 2013-03-22 11:20:23