在我的应用程序中,我有一个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