2013-03-22 135 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