2

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

现在线程调用一些本机代码。在本机方法内部,它被阻塞并等待需要调度的操作系统事件。问题在于ExecutorService.

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

4

1 回答 1

3

错误在于没有返回的本机代码,真的。据我所知,通过更高级别的 java 进行此操作的唯一方法是使用线程 - 由于几个原因stop(),该线程已被弃用。

为此,您需要重新设计以使用老式的Thread而不是ExecutorService. 您也可以这样做,因为大小固定为 1,因此ExecutorService不会给您带来很多好处。stop()据我从您的问题中看到的,如果您在线程中不保留任何锁,这似乎是一个可行的选择stop()

编辑:

根据Apple 的开发人员指南(第 47 页),您可以EventTimeout在调用时指定ReceiveNextEvent

ReceiveNextEvent 运行低级事件循环,将发生的事件放入事件队列中。当您指定的事件发生或超过指定的超时时,该函数返回。

OSStatus ReceiveNextEvent(
UInt32 inNumTypes,
const EventTypeSpec *inList,
EventTimeout inTimeout,
Boolean inPullEvent,
EventRef *outEvent);

因此,如果我理解正确,在调用本机代码时设置超时将为您解决问题。

于 2013-03-22T10:50:27.490 回答