正常执行本机代码的线程正常关闭

时间:2013-03-22 10:11:28

标签: java multithreading native macos-carbon

在我的应用程序中,我有ExecutorService固定大小1

现在线程调用了一些本机代码。在本机方法内部,它被阻塞并等待需要调度的OS事件。问题在于正常关闭ExecutorService

如果我中断线程,那么线程仍然没有出来(显然)。如果我将线程设置为daemon。它仍然不能让JVM关闭。我唯一使用的代码是使用System.exit,这显然是我不打算使用的。还有其他出路吗?

1 个答案:

答案 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);

所以,如果我理解正确设置超时,那么在调用本机代码时就可以解决这个问题。