2013-03-22 101 views
2

在我的應用程序中,我有一個ExecutorService的固定大小1執行本機代碼的線程的優雅關閉

現在線程調用一些本地代碼。在本地方法內部,它被阻塞並等待需要分派的操作系統事件。問題在於ExecutorService的正常關閉。

如果我中斷了線程,那麼線程仍然不出來(很明顯)。如果我將線程設置爲daemon。它仍然不會讓JVM關閉。我唯一的工作代碼是使用System.exit,這是我不打算使用的明顯原因。任何其他出路?

+0

您是否認爲嘗試抓住並結束正常工作? – Madhu 2013-03-22 11:07:35

+1

@Madhu如果它被困在本地代碼中,那麼你不能拋出異常(即嘗試/捕獲任何東西) - 這就是問題所在。 – ddmps 2013-03-22 11:12:32

+0

什麼原生電話被阻止?你能人爲地滿足等待嗎? – 2013-03-22 11:20:23

回答

3

錯誤在於不返回的本地代碼。據我所知,通過更高級別的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); 

所以,如果我理解調用本機代碼就可以了你,當正確設置超時。

+0

'System.stop'不起作用。它仍然被阻止。 – Jatin 2013-03-22 13:04:47

+0

它不是SYstem.stop( ),它是thread.stop()。 – ddmps 2013-03-22 20:58:35

+0

對不起,我的意思是'Thread.stop'只有一個錯誤。線程沒有出來,沒有ThreadDeath異常拋出 – Jatin 2013-03-23 06:04:31