在我的应用程序中,我有ExecutorService
固定大小1
。
现在线程调用了一些本机代码。在本机方法内部,它被阻塞并等待需要调度的OS事件。问题在于正常关闭ExecutorService
。
如果我中断线程,那么线程仍然没有出来(显然)。如果我将线程设置为daemon
。它仍然不能让JVM关闭。我唯一使用的代码是使用System.exit
,这显然是我不打算使用的。还有其他出路吗?
答案 0 :(得分: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);
所以,如果我理解正确设置超时,那么在调用本机代码时就可以解决这个问题。